2012-11-17 100 views
0

我試圖解析與傑克遜JSON字符串,看起來像:映射一個JSON Java類

{ 
    "name":"John", 
    "Wrapper":{ 
    "id":0 
    } 
} 

我試圖防止不得不做出另一個Java類Wrapper,並簡單地將其映射到一個整數代替。我試着用@XmlElementWrapper即使文檔指出:

這主要是爲了用於生產周圍集合包裝XML元素 。

但這不起作用。我得到以下異常:

Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token 
at [Source: [email protected]; line: 1, column: 15] (through reference chain: Test["Wrapper"]) 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer._parseInteger(StdDeserializer.java:305) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:795) 
    at org.codehaus.jackson.map.deser.std.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:782) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299) 
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:579) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854) 
    at Test.main(Test.java:37) 

這裏是一個可運行的例子:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Test { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 
     String json = 
       "{" + 
       "\"name\":\"John\","+ 
       "\"Wrapper\":{"+ 
       " \"id\":0}"+ 
       "}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); 
     mapper.setSerializationInclusion(Inclusion.NON_NULL); 
     Test test = mapper.readValue(json, Test.class); 
     System.out.println(test.toString()); 
    } 

    @XmlElement(name="name") 
    private String name; 

    @XmlElementWrapper(name="Wrapper") 
    @XmlElement(name="id") 
    private Integer wrapperId; 

    @Override 
    public String toString() { 
     return "Test [name=" + name + ", wrapperId=" + wrapperId + "]"; 
    } 

} 
+0

如果您對除Jackson以外的JSON綁定提供程序感興趣,下面是使用EclipseLink MOXy的「@ XmlPath」註釋演示如何支持您的用例的鏈接:http://blog.bdoughan.com/2011/08/ binding-to-json-xml-geocode-example.html –

回答

1

傑克遜提供了結構的有限數量的變換註釋(@JsonUnwrapped,根值包裝),但不是這個用例。我認爲實際上這是一個針對這個特殊用例的功能請求(我認爲它會是@JsonWrapped)。 JAXB註釋模塊確實可以識別註釋,但不用於JSON(它用於XML後端,但僅用於Collection和數組值屬性)。

我只是添加一個簡單的靜態類Wrapper;或者,如果它是一個常見的習慣用法,則共享通用類Wrapper<T>,用於各種包裝值。代碼量很簡單,然後Object結構會與JSON數據結構一一對應。

+0

我最終只是創建了類。這實際上是我迄今爲止遇到的唯一例子。這看起來像我不應該。感謝您的建議。 –

+0

這取決於人們關於數據綁定的哲學:是否使用轉換函數優於簡單的一對一映射。以兩種方式考慮它;在前者中,是的,可以解決JSON和模型之間的阻抗問題。 – StaxMan