将JSON映射到java类 [英] Mapping a JSON to java classes
问题描述
我正在尝试使用杰克逊解析JSON字符串,如下所示:
I am trying to parse a JSON string with jackson that looks like:
{
"name":"John",
"Wrapper":{
"id":0
}
}
我试图阻止为 Wrapper
创建另一个Java类,而只是将其映射到整数。我尝试使用 @XmlElementWrapper
即使文档声明:
I am trying to prevent having to make another Java class for Wrapper
and simply map it to an integer instead. I tried using @XmlElementWrapper
even though the documentation states:
这主要用于生成包装器XML元素
围绕集合。
This is primarily intended to be used to produce a wrapper XML element around collections.
但这不起作用。我得到以下异常:
But that does not work. I get the following exception:
Exception in thread "main" org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token
at [Source: java.io.StringReader@44eefb4; 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)
这是一个可运行的例子:
Here is a runnable example:
@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 + "]";
}
}
推荐答案
Jackson提供有限数量的结构转换注释( @JsonUnwrapped
,根值包装),但不适用于此用例。我认为这个特殊用例实际上有一个功能请求(它是 @JsonWrapped
我想)。
Jackson provides limited number of structure transform annotations (@JsonUnwrapped
, root value wrapping), but not something for this use case. I think there is actually a feature request for this particulal use case (it'd be @JsonWrapped
I think).
对于它的价值,Jackson JAXB注释模块确实识别注释,但它不用于JSON(它用于XML后端,但仅用于 Collection
和数组值属性)。
For what it is worth, Jackson JAXB annotation module does recognize the annotation, but it is not used for JSON (it is used for XML backend, but just for Collection
and array valued properties).
我只想添加一个简单的静态类 Wrapper
;或者,如果它是一个常见的习语,共享泛型类 Wrapper< T>
,用于所有类型的包装值。代码量很简单,然后对象结构将与JSON数据结构一对一匹配。
I would just add a simple static class Wrapper
; or, if it is a common idiom, shared generic class Wrapper<T>
, to use for all kinds of wrapped values. Amount of code would be simple, and Object structure would then match 1-to-1 with JSON data structure.
这篇关于将JSON映射到java类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!