2014-09-05 48 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類。 XML工作正常,但JSON(使用傑克遜)給出了一個錯誤:無法識別的字段「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; 
... 
} 

有沒有辦法來註釋這個類讓傑克遜可以反序列化上面的文字沒有我編寫自定義代碼?順便說一句,維持訂購不是必需的。

+1

我對此表示懷疑。 Web服務沒有返回一個json數組(參見例如http://www.w3schools.com/json/json_syntax.asp),因此您可能必須編寫一些自定義序列化來將其列入列表。 – Taylor 2014-09-06 01:49:41

回答

1

你必須使用JsonAnySetter註釋和您的ZooAnimals類應該是這樣的:

@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類的。下面的程序:

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

完美工作。感謝您提供清晰簡潔的答案。 – 2014-09-08 15:46:48