不更改POJO的不区分大小写的JSON到POJO映射

Mar*_*ner 30 java data-binding json case-insensitive fasterxml

有谁知道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;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类:

@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"));
}
Run Code Online (Sandbox Code Playgroud)

这最终会出现以下错误:
com.fasterxml.jackson.databind.JsonMappingException:无法反序列化...的实例

既不能改变JSON-String也不能改变POJO-Class.

Nic*_*set 59

这种行为是在Jackson 2.5.0中引入的.您可以使用MapperFeature将映射器配置为不区分大小写.ACCEPT_CASE_INSENSITIVE_PROPERTIES.

例如 :

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
Run Code Online (Sandbox Code Playgroud)

  • @自 2.13 起已弃用。现在使用:`JsonMapper.builder().configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)` (2认同)

Dmi*_*ora 25

您可以通过配置映射器来解决此问题,如@Nicolas Riousset 所述。

此外,从 Jackson 2.9 版本开始,您可以@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)在字段或类上使用注释来执行相同的操作,这是一个更灵活的选项。

@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
private String firstName;
Run Code Online (Sandbox Code Playgroud)

  • 即使我将其应用于整个班级,这对我也很有效。(类上方的行)。 (2认同)

Ale*_*nko 13

JsonMapper.builder().configure(...)

\n

方法ObjectMapper.configure()自 Jackson 发布版本2.13以来已被弃用。

\n
\n

已弃用.\xc2\xa0自 2.13 起使用JsonMapper.builder().enable(...)

\n
\n

推荐的方法是使用方法的重载版本之一configure(),该方法来自MapperBuilder(类的父 JsonMapper.Builder 级)

\n

例子:

\n
ObjectMapper mapper = JsonMapper.builder()\n    .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)\n    .build();\n
Run Code Online (Sandbox Code Playgroud)\n

Spring Boot - 应用程序属性

\n

application.properties在 Spring Boot 应用程序中,可以通过文件( application.yml file )内的通用应用程序属性来指定此自定义。

\n
spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_PROPERTIES=true\n
Run Code Online (Sandbox Code Playgroud)\n

ObjectMapperSpring Boot 将在应用程序启动时进行配置时注意应用指定的功能(也可以通过您可以提供的属性,或打开/关闭其他与 Jackson 相关的属性,例如默认区域设置、序列化功能等)。

\n


Dha*_*jay 10

我有同样的问题,无法找到解决这个问题的全球方法.但是,每个属性可以有2个setter来实现此目的:

@JsonSetter("FIRSTNAME")
public void setFirstNameCaps(String firstName) {
    this.firstName = firstName;
}

@JsonSetter("firstName")
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
Run Code Online (Sandbox Code Playgroud)

不优雅,但适用于大小写json字段.您也可以尝试这里提到的解决方案,但这可能会带来性能开销


hol*_*s83 9

从 Jackson 2.12 版本开始,你终于可以在类上进行注释了:

@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
public class Person {
    private String firstName;
    private String lastName;
    private Date dateOfBirth;
    // setters and getters ...
}
Run Code Online (Sandbox Code Playgroud)

正如Github 问题中所述,仍然不支持单属性不区分大小写!


Mar*_*lim 5

package br.com.marcusvoltolim.util;


import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.log4j.Log4j;

@Log4j
public class JsonUtils {

    private static final ObjectMapper OBJECT_MAPPER;

    static {
        OBJECT_MAPPER = new ObjectMapper();
        OBJECT_MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
        OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    }

    public static <T> T fromJson(final String json, final Class<T> classe) {
        try {
            return OBJECT_MAPPER.readValue(json, classe);
        } catch (Exception e) {
            log.error(e);
            try {
                return classe.newInstance();
            } catch (InstantiationException | IllegalAccessException ex) {
                return null;
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)