提问者:小点点

如何使用jackson objectmapper反序列化


我想将json(如下所示)转换为java对象。我已经为json对象创建了java类,目前不使用任何jackson注释。

import com.fasterxml.jackson.databind.ObjectMapper;

public class TestJunkie {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) throws Exception {
        String json = "{\r\n" + 
                "   \"Info\":{\r\n" + 
                "       \"prop1\": \"value1\",\r\n" + 
                "       \"prop2\": \"value2\",\r\n" + 
                "       \"prop3\": \"value3\"\r\n" + 
                "   },\r\n" + 
                "   \"Data\":{\r\n" + 
                "       \"prop1\": \"value1\",\r\n" + 
                "       \"prop2\": \"value2\"\r\n" + 
                "   }\r\n" + 
                "}";

        Pack pack = objectMapper.readValue(json, Pack.class);
        System.out.println(pack);
    }

}

我将上面的Json对象转换为下面名为“Pack”的Java类:

import org.apache.commons.lang3.builder.ToStringBuilder;

public class Pack {

    private Info info;
    private Data data;

    public Info getInfo() {
        return info;
    }

    public void setInfo(Info info) {
        this.info = info;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("info", info).append("data", data).toString();
    }

}

我故意省略了信息和数据的类。他们的变量、getter、setter 与 json 匹配。如果你愿意,我可以包括它们。

我得到了下面的异常。为什么会出现这种异常

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Info" (class com.tester.Jacksons.Pack), not marked as ignorable (2 known properties: "data", "info"])
 at [Source: (String)"{
    "Info":{
        "prop1": "value1",
        "prop2": "value2",
        "prop3": "value3"
    },
    "Data":{
        "prop1": "value1",
        "prop2": "value2"
    }
}"; line: 2, column: 10] (through reference chain: com.tester.Jacksons.Pack["Info"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:60)
    at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:822)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1152)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1582)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1560)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2992)
    at com.tester.Jacksons.TestJunkie.main(TestJunkie.java:22)

共2个答案

匿名用户

您的对象的键是小写的,在json中它们是大写的。如果这种命名方案是一致的,您可以在对象映射器上设置命名策略。

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UpperCamelCaseStrategy);

匿名用户

您在Pack中的属性与名称不匹配,因为在json中它是以大写字母开头的。因此,更新< code>Pack,如下所示:

import org.apache.commons.lang3.builder.ToStringBuilder;

public class Pack {

    @JsonProperty("Info")
    private Info info;
    @JsonProperty("Data")
    private Data data;

    public Info getInfo() {
        return info;
    }

    public void setInfo(Info info) {
        this.info = info;
    }

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("info", info).append("data", data).toString();
    }

}

另外,如果有未在Info或Data类中指定的属性。在类上使用@JsonIgnoreProperties(忽略未知=true)注释来忽略未知属性。

更新

如果你必须使用和Hibernate实体一样的类或者在其他地方使用,那么使用注释可能不是很方便。因此,我建议您使用d to执行< code >序列化和反序列化,然后在需要时将这些dto中的值放到其他对象中。您可以使用像< code>mapstruct这样的优秀API来创建这样的对象。