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.
}
}
내 질문 :
- 이 처음부터 올바른 접근 방식인가?
- 왜 실행이
deserialize()
에 도착하지 않는다고 생각합니까? (나는 선택의cars
개체가 JSON에 존재한다.
은?
불행히도 서버에서 들어오는 JSON을 제어하지 못합니다. – Rettel