今天在测试jackson解析json串时,发现如果json串中,Key的值为大写的话,那么解析就会报错,这里给大家复现一下以及提供一种解决方案:
首先,我们建立一个实体类:这里简单定义了name,sex,age三个属性,以及get set tostring方法。
public class Student {
private String name;
private String sex;
private Integer age;
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
然后我们写一个测试类:
@Test
public void testJackson() throws Exception {
String jsonStr = "{\"age\":20,\"name\":\"lisi\",\"Sex\":\"男\"}";
ObjectMapper om = new ObjectMapper();
Student stu = om.readValue(jsonStr, Student.class);
System.out.println(stu);
}
这里运行,我们会报错无法识别的filed:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field
这个问题可以在我另一篇文章里找到解决方案,需要的可以详细看一下:
(https://blog.csdn.net/MrHamster/article/details/85268990)
这里直接给出解决方案,在类上加@JsonIgnoreProperties(ignoreUnknown = true),就可以忽略掉不认识的field
加上注解后,我们继续运行测试类,发现虽然可以正常运行了,但运行结果却是:Student [name=lisi, sex=null, age=20],sex这个字段没有被成功赋值。原因是jackson不支持大写的Key去解析,fastjson是可以成功支持这个的,fastjson会忽略大小写。
但是项目中假如已经使用了jackson,现在再进行更换,难免会提高难度,所以我们换一种方法去解决这个问题:我们在实体类的对应字段上加:@JsonProperty(value = “XXX”),这里的XXX就是大写的key,这样的话,jackson就会根据这个XXX去把值赋到实体类对应的字段中。