杰克逊克服了下划线,支持骆驼案

时间:2012-05-09 15:30:00

标签: java jackson

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

例如,我可能在camel-case中有UserfirstName字段,同时我需要以某种方式告诉Jackson将first_name键从JSON映射到{{1} } class field。有可能吗?

firstName

9 个答案:

答案 0 :(得分:278)

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

this.objectMapper.setPropertyNamingStrategy(
    PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

答案 1 :(得分:91)

如果是Spring启动应用程序,请在application.properties文件中使用

  

spring.jackson.property命名策略= SNAKE_CASE

或使用此注释注释模型类。

  

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

答案 2 :(得分:86)

您应该在要更改默认名称映射的字段上使用@JsonProperty

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

更多信息:API

答案 3 :(得分:34)

如果您希望将其用于单个班级,则可以将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;

}

答案 4 :(得分:25)

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

答案 5 :(得分:8)

目前的最佳做法是在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
    }

} 

答案 6 :(得分:6)

这里几乎没有答案表明以下两种不同版本的Jackson库的策略:

对于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);

答案 7 :(得分:1)

为了注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

代替:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

自 2.12 起已弃用。

答案 8 :(得分:0)

在我看来,对所有模型类进行注释是过大的,肯尼(Kenny)的答案对我没有用https://stackoverflow.com/a/43271115/4437153。序列化的结果仍然是骆驼案。

我意识到我的弹簧配置存在问题,所以我不得不从另一个角度解决这个问题。希望有人会发现它有用,但是如果我违反弹簧规则做事,请告诉我。

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);
    }
}