195

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

例如,我可能有一个User带有驼峰式字段的类firstName,同时我需要以某种方式告诉杰克逊将first_name键从 JSON 映射到firstName类字段。是否可以?

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

10 回答 10

441

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

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

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

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

在 Jackson 2.7 之前,该常量被命名为:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
于 2012-07-24T13:35:29.383 回答
136

如果它是一个 spring boot 应用程序,在 application.properties 文件中,只需使用

spring.jackson.property-naming-strategy=SNAKE_CASE

或使用此注解对模型类进行注解。

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

于 2016-11-21T22:12:56.443 回答
129

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

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

更多信息:API

于 2012-05-09T15:33:13.517 回答
55

如果您希望将其用于单个类,则可以将PropertyNamingStrategy@JsonNaming一起使用,如下所示:

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

    String businessName;
    String businessLegalName;

}

将序列化为:

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

由于不赞成使用 in Jackson 2.7,因此您应该使用:LowerCaseWithUnderscoresStrategySnakeCaseStrategy

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

    String businessName;
    String businessLegalName;

}
于 2016-09-12T23:20:21.810 回答
31

@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);
}
于 2015-01-13T15:10:00.390 回答
18

当前的最佳实践是在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
    }

} 
于 2017-04-07T06:28:04.783 回答
6

这里很少有答案表明以下 2 个不同版本的 Jackson 库的两种策略:

对于杰克逊 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);
于 2018-04-05T19:11:57.340 回答
4

注释所有模型类在我看来是一种矫枉过正,肯尼的回答对我不起作用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);
    }
}
于 2020-09-03T10:07:01.643 回答
3

为了注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

代替:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

自 2.12 起已弃用。

于 2021-04-21T08:02:51.003 回答
0
  1. 您可以在我们类的字段上使用 @JsonProperty 注释将字段映射到我们 JSON 中的确切名称

    @JsonProperty("my_name")
    private String myName;
    
  2. 可以在类上使用@JsonNaming注解,所有字段都会使用snake case反序列化

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

}

  1. 您可以使用 ObjectMapper 上的 setPropertyNamingStrategy 方法来配置它以进行所有序列化

    ObjectMapper objectMapper = new ObjectMapper()
    .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

于 2022-01-17T07:17:06.237 回答