有个哥们写的比较清楚了,就直接转过来了,原文为:https://www.jianshu.com/p/785d7a043e4c
问题描述
使用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; }
假设程序调用了别人的接口,返回一个描述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在转换时忽略不能映射的字段。