将JSON映射到java类 [英] Mapping a JSON to java classes

查看:109
本文介绍了将JSON映射到java类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用杰克逊解析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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆