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

例如,我可能有一个用户类的firstName字段在驼峰情况下,同时我需要以某种方式告诉杰克逊映射first_name键从JSON到firstName类字段。这可能吗?

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

当前回答

当前的最佳实践是在应用程序中配置Jackson。Yml(或属性)文件。

例子:

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
    }

} 

其他回答

为了注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

而不是:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

自2.12以来已弃用。

如果你想要一个类,你可以使用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.7到Jackson 2.12, LowerCaseWithUnderscoresStrategy被弃用,取而代之的是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;

    }

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

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

欲了解更多信息:API

当前的最佳实践是在应用程序中配置Jackson。Yml(或属性)文件。

例子:

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
    }

} 

可以在类的字段上使用@JsonProperty注释,将字段映射到JSON中的确切名称 @JsonProperty(“my_name”) private String myName; 您可以在类上使用@JsonNaming注释,所有字段都将使用蛇形大小写进行反序列化 @JsonNaming (PropertyNamingStrategy.SnakeCaseStrategy.class) 公共类MyClassWithSnakeStrategy{…

}

您可以在ObjectMapper上使用setPropertyNamingStrategy方法为所有序列化配置它 ObjectMapper ObjectMapper = new ObjectMapper() .setPropertyNamingStrategy (PropertyNamingStrategy.SNAKE_CASE);