Джексон преодолевает подчеркивания в пользу верблюжьего случая

Я извлекаю строку JSON из Интернета; как и большинство JSON, я видел, что он включает в себя длинные клавиши, разделенные символами подчеркивания. По сути, моя цель - десериализовать JSON в java-объекты, но я не использую символы подчеркивания в Java-коде.

Например, у меня может быть класс User с полем firstName в верблюжьем футляре, одновременно мне нужно как-то сказать Джексону отобразить ключ first_name из поля класса JSON в firstName. Возможно ли это?

class User{
    protected String firstName;
    protected String getFirstName(){return firstName;}
}

Ответ 1

Вы должны использовать @JsonProperty в поле, которое вы хотите изменить сопоставление имен по умолчанию.

class User{
    @JsonProperty("first_name")
    protected String firstName;
    protected String getFirstName(){return firstName;}
}

Для получения дополнительной информации: API

Ответ 2

Вы можете настроить ObjectMapper для преобразования регистра верблюда в имена с подчеркиванием:

this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

До Джексона 2.7 константа называлась:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

Ответ 3

Если это приложение загрузки spring, в файле application.properties просто используйте

spring.jackson.property именования-стратегия = SNAKE_CASE

Или Аннотировать класс модели с помощью этой аннотации.

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)

Ответ 4

Если вы хотите это для одного класса, вы можете использовать PropertyNamingStrategy с @JsonNaming, что-то вроде этого:

@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public static class Request {

    String businessName;
    String businessLegalName;

}

Будет сериализовать в:

{
    "business_name" : "",
    "business_legal_name" : ""
}

Начиная с Jackson 2.7 LowerCaseWithUnderscoresStrategy устарела в пользу SnakeCaseStrategy, поэтому вы должны использовать:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public static class Request {

    String businessName;
    String businessLegalName;

}

Ответ 5

Вышеуказанные ответы в отношении @JsonProperty и CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES на 100% точны, хотя некоторые люди (например, я) могут пытаться сделать это в приложении Spring MVC с кодовой конфигурацией. Здесь пример кода (который у меня внутри Beans.java) для достижения желаемого эффекта:

@Bean
public ObjectMapper jacksonObjectMapper() {
    return new ObjectMapper().setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}

Ответ 6

В настоящее время рекомендуется настроить Джексона в файле application.yml (или properties).

Пример:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE

Если у вас есть более сложные требования к конфигурации, вы также можете настроить Джексона программно.

import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
        return new Jackson2ObjectMapperBuilder()
                .propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        // insert other configurations
    }

} 

Ответ 7

Ниже приведено несколько ответов, указывающих обе стратегии для двух разных версий библиотеки Джексона:

Для Джексона 2.6. *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

Для Джексона 2.7. *

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);