2017-03-10 2 views
0

Retrofit 응답의 일부로 Jackson 2.8을 사용하여이 JSON 객체의 비 직렬화를 시도하고 있습니다. 다음은 서버에서 얻은 JSON 응답입니다.Jackson JSON 배열 값 비 직렬화

{ 
"id":"8938209912" 
"version":"1.1" 
"cars":{ 
    "mercedes":[ 
     { 
      "property":"color" 
     }, 
     { 
      "property":"price" 
     }, 
     { 
      "property":"location" 
     } 
    ], 
    "tesla":[ 
     { 
      "property":"environment" 
     } 
    ] 
    } 
} 

쿼리를 기반으로 cars 상기 하나 개 이상의 모델을 반환 할 수 있습니다. 이 모델들은 임의로 생성/제거되므로 각 모델에 대해 클래스를 만들 수 없습니다. 자동차의 각 모델 (예 : tesla)에는 하나 이상의 property 키 - 값 쌍이있을 수 있습니다.

저는 Jackson에 새입니다. 몇 가지 예제를 살펴본 결과 @JsonDeserialize은 가장 좋은 방법입니다. 그래서,이 같은 Root 클래스와 Cars 클래스를 만들었 :

// In file Root.java 
public class Root { 
    @JsonProperty("id") 
    private String id = null; 


    @JsonProperty("version") 
    private String version = null; 

    @JsonProperty("cars") 
    private Cars cars = null; 
} 

// In file Cars.java 
public class Cars { 

    public Cars(){} 

    @JsonDeserialize(using = CarDeserializer.class) 
    private Map<String, List<Property>> properties; 

    public Map<String, List<Property>> getProperties() { 
     return properties; 
    } 

    public void setProperties(Map<String, List<Property>> properties) { 
     this.properties = properties; 
    } 
} 

// Property.java 
public class Property { 

    @JsonProperty("property") 
    private String property; 
} 

내 역 직렬화는 다음과 같습니다. 그러나 빈 생성자가 호출 되더라도 parse 메서드 자체는 전혀 호출되지 않습니다!

 // CarDeserializer.class 
    public class RelationshipDeserializer extends StdDeserializer<Map<String, List<Action>>>{ 

     protected RelationshipDeserializer(){ 
      super(Class.class); 
     } 

     @Override 
     public Map<String, List<Action>> deserialize(JsonParser parser, DeserializationContext ctx) 
     throws IOException, JsonProcessingException 
     { 
      // This method never gets invoked. 
     } 
    } 

내 질문 :

  1. 이 처음부터 올바른 접근 방식인가?
  2. 왜 실행이 deserialize()에 도착하지 않는다고 생각합니까? (나는 선택의 cars 개체가 JSON에 존재한다.
  3. 은?

답변

0

Jackson를 사용하여이 JSON을 구문 분석하는 더 나은 방법이있는 것을 그 JSON에서 아무것도 일치하지 않기 때문에 "속성"디시리얼라이저가 호출되지 않습니다. json으로의 필드 이름 "속성"이며이 Map<String, List<Property>>과 일치하지 않습니다. 당신이 JSON을 오는에를 제어하는 ​​List<Property>

에 가까운 것처럼 보이는? 그것은 차 이름에 대한 더 좋을 것이다/유형은합니다 객체의 이름이 아니라 자체 필드에 저장하면 일반 객체를 사용할 수 있습니다. 그들은 새로운 이름/유형을 추가 할 때 그 객체와 일치하는 객체가 없습니다.

+0

불행히도 서버에서 들어오는 JSON을 제어하지 못합니다. – Rettel