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

use*_*991 146 java jackson

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

例如,我可能在camel-case中有一个UserfirstName字段的类,同时我需要以某种方式告诉Jackson将first_name密钥从JSON 映射到firstName类字段.可能吗?

class User{
    protected String firstName;
    protected String getFirstName(){return firstName;}
}
Run Code Online (Sandbox Code Playgroud)

the*_*hpi 306

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

this.objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
Run Code Online (Sandbox Code Playgroud)

  • @deprecated自2.7以后使用SNAKE_CASE; (61认同)
  • 在 Jackson 2.12+ 中使用注释时:`@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)` (7认同)
  • 请注意,这仅在Jackson 1.9中引入. (5认同)
  • 从 Jackson 2.12 开始,它是“PropertyNamingStrategies.SNAKE_CASE” (4认同)
  • 一QQ:当我使用snake_case命名策略时,带有下划线的json文件是否会被反序列化为驼峰命名法? (2认同)
  • @Ramswaroop是的,这让Jackson既说话又期待snake_case (2认同)
  • 我认为 Jackson 是一个不太一致的库,总是来回改变它们的常量。 (2认同)

小智 112

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

spring.jackson.property命名策略= SNAKE_CASE

或者使用此批注对模型类进行批注.

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

  • 如果我使用"@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)"注释我的类,它可以工作.但如果我在"application.properties"中使用"spring.jackson.property-naming-strategy = SNAKE_CASE"则不会.我正在使用"Spring Boot(v2.0.0.BUILD-SNAPSHOT)".你有什么想法 ? (3认同)
  • 同样在这里, `spring.jackson.property-naming-strategy=SNAKE_CASE` 不起作用,我正在使用 Spring Boot 2.0 (2认同)

Ale*_*lex 92

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

class User{
    @JsonProperty("first_name")
    protected String firstName;
    protected String getFirstName(){return firstName;}
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息:API

  • 不要这样做,否则你将不得不为每个财产做这件事.请参阅下面的hpi回复. (74认同)

Art*_*lpe 41

如果你想要单个类,你可以使用PropertyJamingStrategy@JsonNaming,如下所示:

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

    String businessName;
    String businessLegalName;

}
Run Code Online (Sandbox Code Playgroud)

将序列化为:

{
    "business_name" : "",
    "business_legal_name" : ""
}
Run Code Online (Sandbox Code Playgroud)

由于Jackson 2.7LowerCaseWithUnderscoresStrategy中弃用,取而代之的SnakeCaseStrategy,所以你应该使用:

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

    String businessName;
    String businessLegalName;

}
Run Code Online (Sandbox Code Playgroud)


Duf*_*ffJ 27

以上答案关于@JsonProperty并且CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES100%准确,尽管有些人(像我一样)可能试图在具有基于代码的配置的Spring MVC应用程序中执行此操作.这里是示例代码(我在里面Beans.java)以实现所需的效果:

@Bean
public ObjectMapper jacksonObjectMapper() {
    return new ObjectMapper().setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}
Run Code Online (Sandbox Code Playgroud)

  • Spring Boot的另一种选择,如果你在`application.properties`中使用Spring Boot <= 1.3,请添加`spring.jackson.property-naming-strategy = CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCOR ES`.对于Spring Boot 1.4,请使用`spring.jackson.property-naming-strategy = SNAKE_CASE`. (8认同)

小智 13

为了注释模型类,请使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
Run Code Online (Sandbox Code Playgroud)

代替:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
Run Code Online (Sandbox Code Playgroud)

自 2.12 起已弃用。


Ken*_*son 12

目前的最佳做法是在application.yml(或properties)文件中配置Jackson .

例:

spring:
  jackson:
    property-naming-strategy: SNAKE_CASE
Run Code Online (Sandbox Code Playgroud)

如果您有更复杂的配置要求,还可以通过编程方式配置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
    }

} 
Run Code Online (Sandbox Code Playgroud)


Ana*_*ika 6

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

对于杰克逊2.6.*

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
Run Code Online (Sandbox Code Playgroud)

杰克逊2.7.*

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);
Run Code Online (Sandbox Code Playgroud)