Джексон преодолевает подчеркивания в пользу верблюжьего случая
Я извлекаю строку 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);