2013-03-05 4 views
0

개체 매퍼에 대한 JSON을 만들려고합니다. 주요 개념은 "user"가 키가 JSON 속성이고 값이 Objects 속성 이름 인 사전을 정의한다는 것입니다. 그래서 어떻게 (지금까지) 작동합니까 : 동적으로 값을 설정 (동적 속성/유형)

  • 는 세터 방법을 만들기 JSON
  • 이 게터에서 속성 유형을 가져옵니다 (var에 jsonValue) (var에 methodType)에서

    1. 가져 오기 값과 JSON에서 값을 삽입

    jsonValue를 객체에 동적으로 캐스트 할 수 없다는 문제가 있습니다. 객체 유형 (methodType)이 무엇인지 확인한 다음 String, Long, Integer 등과 같이 다르게 캐스팅해야합니다. 어떻게 든 그것을 동적으로 캐스팅 할 수 있습니까?

    private Cookbook createCookbook(JsonObject jsonCookbook) { 
        //Cookbook to return 
        Cookbook cookbook = new Cookbook(); 
    
        Enumeration<String> e = mappingDictionary.keys(); 
        while (e.hasMoreElements()) { 
         //get JSON value 
         String mappingKey = e.nextElement(); 
         JsonElement json = jsonCookbook.get(mappingKey); 
         String jsonValue = json.getAsString(); 
    
         //set JSON value to property 
         String mappingValue = mappingDictionary.get(mappingKey); 
    
         //reflection 
         try { 
          //get type of the getter 
          String getMethodName = "get" + mappingValue; 
          Method getMethod = cookbook.getClass().getMethod(getMethodName, null); 
          Class<?> methodType = getMethod.getReturnType(); 
    
          //set methods 
          String setMethodName = "set" + mappingValue; 
          Method setMethod = cookbook.getClass().getMethod(setMethodName, methodType); 
    
          //set value to property 
          /* DONT WANT TO DO IT LIKE THIS, THIS IS MY PROBLEM */ 
          if (methodType.equals(String.class)) 
           setMethod.invoke(cookbook, jsonValue); 
          if (methodType.equals(Long.class)) 
           setMethod.invoke(cookbook, Long.valueOf(jsonValue)); 
    
         } catch (NoSuchMethodException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } catch (IllegalArgumentException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } catch (IllegalAccessException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } catch (InvocationTargetException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         }   
        } 
    
        return cookbook; 
        } 
    
  • 답변

    0

    당신은 (당신은 사용) 반사를 사용하여 런타임에 알 수없는 유형의 비 원시적 인 개체를 만들고 .newInstance() 메소드 할 수 있습니다.

    예를 들어 표준 JDK 직렬화 구현 (ObjectWriter의 writeObject())을 살펴보면 8 가지 경우에 스위치가 표시되는 것과 같이 이러한 방식으로 기본 유형을 만들 수 없습니다.

    +0

    methodType.newInstance();로 새 클래스를 만드는 것이 좋습니다. 하지만 내 String (jsonValue)을 새로 생성 된 객체로 변환하는 방법을 모르겠습니다. – paxx

    +0

    ObjectInputStream의 소스를 확인하십시오. 메서드 "private Object readArray"는 귀하의 질문에 대한 대답을 포함 할 수 있습니다 –

    +0

    ObjectInputStream을 검사했지만 유형을 감지하고 유형을 개별적으로 파싱하는 것을 볼 수 있습니다 .. 그 방법은 .. 갈 수 있습니다. 어떤 "똑똑한"방법을 찾아야한다. – paxx