2014-09-05 5 views
1

를 사용하여 인덱스 배열 역 직렬화 않습니다 XML 형식으로 요청이있을 경우가 어떻게 내가 형식의 배열을 반환하는 웹 서비스 참조하고있어 잭슨

{ 
    "ZooAnimals": { 
     "@size": "2", 
     "Animal": { 
      "0": { 
       "@name": "elephant", 
       "@size": "huge" 
      }, 
      "1": { 
       "@name": "termite", 
       "@size": "verysmall" 
      } 
     } 
    } 
} 

그것을 반환

<ZooAnimals size="2"> 
    <Animal name="elephant" size="huge"></Animal> 
    <Animal name="termite" size="very small"></Animal> 
</ZooAnimals> 

Java 클래스로 올바르게 deserialize되는지 확인하기위한 테스트를 작성하고 있습니다. XML은 제대로 작동하지만 JSON (jackson 사용)은 오류가 발생합니다. 인식 할 수없는 필드 "0"은 무시할 수 없음으로 표시됩니다.

JSON 응답을 제어하지 않으며 단일 클래스를 사용하여 비 직렬화 된 컨텐츠를 수신하는 것을 선호합니다. 내가 상속 클래스는 다음과 같이 주석 하였다

@XmlAccessorType(XmlAccessType.FIELD) 
@JsonInclude(JsonInclude.Include.NON_DEFAULT) 
@JsonTypeName("ZooAnimals") 
public class ZooAnimals { 

    @XmlAttribute 
    @JsonProperty("@size") 
    private String size; 

    @XmlElement(name = "Animal", required = false) 
    @JsonProperty("Animal") 
    private List<Animal> animalList; 
... 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
@JsonInclude(JsonInclude.Include.NON_DEFAULT) 
@JsonTypeName("Animal") 
public class Animal { 

    @XmlAttribute 
    @JsonProperty("@name") 
    private String name; 

    @XmlAttribute 
    @JsonProperty("@size") 
    private String size; 
... 
} 

잭슨 내 사용자 정의 코드를 작성하지 않고도 위의 텍스트를 역 직렬화 할 수 있도록이 클래스를 주석하는 방법이 있나요? 제쳐두고 주문 유지는 필수 사항이 아닙니다.

@XmlAccessorType(XmlAccessType.FIELD) 
@JsonInclude(JsonInclude.Include.NON_DEFAULT) 
@JsonTypeName("ZooAnimals") 
class ZooAnimals { 

    @XmlAttribute 
    @JsonProperty("@size") 
    private String size; 

    @XmlElement(name = "Animal", required = false) 
    private List<Animal> animalList; 

    @JsonAnySetter 
    public void setAny(String propertyName, Map<String, Animal> map) { 
     animalList = new ArrayList<Animal>(map.values()); 
    } 

    // getters, setters, toString 
} 

당신은 모든 Animal 클래스를 변경할 필요가 없습니다 :

+1

나는 그것을 의심한다. 웹 서비스는 json 배열을 반환하지 않습니다 (예 : http://www.w3schools.com/json/json_syntax.asp 참조). 따라서 사용자 정의 직렬화를 작성하여 목록에 넣어야 할 것입니다. – Taylor

답변

1

당신은 다음과 같아야합니다 JsonAnySetter 주석과 ZooAnimals 클래스를 사용합니다.

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
ZooAnimals zooAnimals = mapper.readValue(XML, ZooAnimals.class); 
System.out.println(zooAnimals); 

인쇄 : 프로그램 아래

ZooAnimals{size='2', animalList=[Animal{name='elephant', size='huge'}, Animal{name='termite', size='verysmall'}]} 
+1

완벽하게 일했습니다. 간결한 답변을 주셔서 감사합니다. –