jackson报错:Unrecognized field xxx

2018-01-03  本文已影响63人  8813d76fee36

问题描述

使用Jackson的ObjectMapper将json字符串转换为对象时报错:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "sex" (class dev.wj.jacksonunrecognizedfielddemo.entity.User), not marked as ignorable (2 known properties: "name", "age"])
 at [Source: {"age":18, "name":"wj", "sex":1}; line: 1, column: 32] (through reference chain: dev.wj.jacksonunrecognizedfielddemo.entity.User["sex"])

问题分析

错误信息提示,未识别字段“sex”。
引起该问题的原因是在使用ObjectMapper将json字符串转换为对象时,被映射的对象中没有和json串中的字段对应。

举例

首先先建立User类,包含age和name两个字段。

public class User {

    private Integer age;

    private String name;

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("User{");
        sb.append("age=").append(age);
        sb.append(", name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

假设程序调用了别人的接口,返回一个描述user信息的json字符串:

"
  {
    "age": 18,
    "name": "wj",
    "sex": "男"
  }
"

该json串中包含了age、name、和sex三个字段。
此时如果将该字符串映射为User对象即会报出Unrecognized field xxx错误。

@RunWith(SpringRunner.class)
@SpringBootTest
public class JacksonTest {

    @Test
    public void jacksonTest() {

        String json = "{\"age\": 18, \"name\": \"wj\", \"sex\": \"男\"}";

        ObjectMapper objectMapper = new ObjectMapper();

        User user = null;
        try {
            user = objectMapper.readValue(json, User.class);
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(user.toString());
    }
}

原因就是json串中的sex字段在User类中没有对应的字段映射。

解决方案

如果json中包含的字段都是有用的,那么映射类应包含所有json串中包含的字段。如在User类中添加private String sex字段即可。

如果json串中的字段不完全需要映射到实体类中,则可在实体类上加上@JsonIgnoreProperties(ignoreUnknown = true)注解,时jackson在转换时忽略不能映射的字段。

上一篇 下一篇

猜你喜欢

热点阅读