Jackson 中将下划线的 key 转换为驼峰式

我检索一个JSON字符串从互联网;像大多数JSON一样,我看到它包含用下划线分隔的长键。从本质上讲,我的目标是将JSON反序列化为java对象,但我没有在java代码中使用下划线。

例如,我可能有一个带有驼驼形firstName字段的User类,同时我需要以某种方式告诉Jackson将first_name键从JSON映射到firstName类字段。这可能吗?

class User{
protected String firstName;
protected String getFirstName(){return firstName;}
}
175304 次浏览

你应该在你想要改变默认名称映射的字段上使用@JsonProperty

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

有关更多信息:API

你可以配置ObjectMapper将驼峰大小写转换为带下划线的名称:

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

或者用这个注释注释一个特定的模型类:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

在Jackson 2.7之前,这个常数被命名为:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

上面关于@JsonPropertyCAMEL_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);
}

如果你想在单个类中使用这个,你可以使用PropertyNamingStrategies@JsonNaming,注释,如下所示:

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


String businessName;
String businessLegalName;


}

将序列化到:

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

Jackson 2.7之前,使用PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class:

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


String businessName;
String businessLegalName;


}

Jackson 2.7Jackson 2.12LowerCaseWithUnderscoresStrategy已弃用,而改用SnakeCaseStrategy,所以你应该使用:

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


String businessName;
String businessLegalName;


}

由于Jackson 2.12中的PropertyNamingStrategy.SnakeCaseStrategy已弃用,取而代之的是PropertyNamingStrategies.SnakeCaseStrategy,你应该使用:

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


String businessName;
String businessLegalName;


}

如果它是一个弹簧启动应用程序,在应用程序。属性文件,使用即可

spring.jackson.property-naming-strategy = SNAKE_CASE

或者用这个注释注释模型类。

@JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class)

当前的最佳实践是在application.yml(或properties)文件中配置Jackson。

例子:

spring:
jackson:
property-naming-strategy: SNAKE_CASE

如果您有更复杂的配置需求,还可以通过编程方式配置Jackson。

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
}


}

以下是两个不同版本Jackson库的两种策略:

对于杰克逊2.6

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

对于Jackson 2.7.*

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

注释所有的模型类在我看来是一个过度和肯尼的答案没有为我工作https://stackoverflow.com/a/43271115/4437153。系列化的结果仍然是驼峰情况。

我意识到我的弹簧配置有问题,所以我必须从另一个方面解决这个问题。希望有人觉得它有用,但如果我做了一些违反spring规则的事情,请告诉我。

Spring MVC 5.2.5和Jackson 2.11.2的解决方案

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);


MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(objectMapper);
converters.add(converter);
}
}

为了注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

而不是:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

自2.12以来已弃用。

  1. 您可以在类的字段上使用@JsonProperty注释来将字段映射到JSON中的确切名称

    @JsonProperty("my_name")
    private String myName;
    
  2. 你可以在类上使用@JsonNaming注释,所有字段都将使用蛇形大小写反序列化

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
    public class MyClassWithSnakeStrategy { ...
    

  1. 您可以在ObjectMapper上使用setPropertyNamingStrategy方法为所有序列化配置它

    ObjectMapper ObjectMapper = new ObjectMapper()
    .setPropertyNamingStrategy (PropertyNamingStrategy.SNAKE_CASE); < / p >

@JsonNaming的PropertyNamingStrategy应该替换为PropertyNamingStrategies