不更改POJO的情况下,不区分大小写的JSON到POJO映射
有谁知道com.fasterxml.jackson.databind.ObjectMapper如何能够将JSON属性映射到POJO属性不区分大小写?
JSON字符串:
[{ “FIRSTNAME”: “约翰”, “LASTNAME”: “Doe的”, “DATEOFBIRTH”: “1980-07-16T18:25:00.000Z”}]
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")); }
这最终会出现以下错误:
com.fasterxml.jackson.databind.JsonMappingException:无法反序列化…的实例
既不能改变JSON-String也不能改变POJO-Class。
这种行为是在Jackson 2.5.0中引入的。 您可以使用MapperFeature将映射器配置为不区分大小写。 ACCEPT_CASE_INSENSITIVE_PROPERTIES 。
例如 :
ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
我有同样的问题,无法找到解决这个问题的全球方法。 但是,每个属性可以有2个setter来实现此目的:
@JsonSetter("FIRSTNAME") public void setFirstNameCaps(String firstName) { this.firstName = firstName; } @JsonSetter("firstName") public void setFirstName(String firstName) { this.firstName = firstName; }
不优雅,但适用于大小写json字段。 您也可以尝试这里提到的解决方案,但这可能会带来性能开销
我处于同样的情况,不得不转换为地图,然后手动复制值。
import com.fasterxml.jackson.core.type.TypeReference; Map map = mapper.readValue(jsonAsString, new TypeReference