有人知道com.fasterxml.jackson.databind.ObjectMapper是如何将JSON属性Map到不区分大小写的POJO属性的吗?
- JSON字符串:*
[{“名字”:“约翰”,“姓氏”:“无名氏”,“出生日期”:“1980-07- 16 T18:25:00. 000 Z”}]
- POJO等级:*
public class Person {
private String firstName;
private String lastName;
private Date dateOfBirth;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
- 测试类别:*
@Test
public final void testDeserializingPersonJsonToPersonClass()
throws JsonParseException, JsonMappingException, IOException {
final String jsonAsString = "[{\"FIRSTNAME\":\"John\",\"LASTNAME\":\"Doe\",\"DATEOFBIRTH\":\"1980-07-16T18:25:00.000Z\"}]";
final ObjectMapper mapper = new ObjectMapper();
final Person person = mapper.readValue(jsonAsString, Person.class);
assertNotNull(person);
assertThat(person.getFirstName(), equalTo("John"));
}
最后得到JsonMappingException
:
com.fasterxml.jackson.databind.JsonMappingException:
Can not deserialize instance of ...
JSON-String和POJO-Class都无法更改。
8条答案
按热度按时间8ljdwjyq1#
此行为是在Jackson2.5.0中引入的。您可以使用MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES将Map器配置为不区分大小写。
例如:
eyh26e7m2#
您可以通过配置Map器来解决此问题,如@Nicolas Riousset中所述。
此外,从Jackson2.9版本开始,您可以在字段或类上使用注解
@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
来执行相同的操作,这是一个更灵活的选项。ijxebb2r3#
我也遇到了同样的问题,但找不到一个全局的方法来解决这个问题。不过,你可以为每个属性设置两个setter来实现这个目标:
不太好,但是对于大小写json字段都有效。您也可以尝试here提到的解决方案,但是这可能会有性能开销
vsnjm48y4#
q9yhzks05#
从Jackson2.12版开始,您终于可以对类进行注解了:
如Github issue中所述,仍然不支持单属性不区分大小写!
qeeaahzv6#
如果有人希望在POJO本身的字段级别处理此问题,他们可以使用以下两个注解中的任何一个
或者
2w3rbyxf7#
第一个月
自Jackson的发行版本2.13以来,
ObjectMapper.configure()
方法已被弃用。不推荐使用。从2.13开始使用
JsonMapper.builder().enable(...)
建议的方法是使用
configure()
方法的重载版本,该方法来自MapperBuilder
(*JsonMapper.Builder
* 类的 * 父级)*Sping Boot -应用程序属性
在Sping Boot 应用程序中,可以通过
application.properties
文件(* 或 *application.yml
* 文件 *)中的“公用应用程序属性”指定此自定义。Sping Boot 会在应用程序启动时配置
ObjectMapper
时注意应用指定的特性(* 也通过您可以提供的属性,或打开/关闭其他与Jackson相关的属性,如默认语言环境、序列化特性等 *)。tzxcd3kk8#
我也遇到了同样的情况,不得不转换为Map,然后手动复制这些值。