Java 杰克逊强调支持骆驼案

Java 杰克逊强调支持骆驼案,java,jackson,Java,Jackson,我从internet检索JSON字符串;像我见过的大多数JSON一样,它包含由下划线分隔的长键。本质上,我的目标是将JSON反序列化为java对象,但我在java代码中不使用下划线 例如,在camel case中,我可能有一个User类和firstName字段,同时我需要告诉Jackson将first\u name键从JSON映射到firstName类字段。可能吗 class User{ protected String firstName; protected String g

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

例如,在camel case中,我可能有一个
User
类和
firstName
字段,同时我需要告诉Jackson将
first\u name
键从JSON映射到
firstName
类字段。可能吗

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

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

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

有关详细信息:

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

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
或使用此注释注释特定模型类:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
在Jackson 2.7之前,该常数的名称为:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

以上关于
@JsonProperty
带下划线的CAMEL\u CASE\u TO\u LOWER\u CASE\u的答案是100%准确的,尽管有些人(比如我)可能会尝试在基于代码配置的Spring MVC应用程序中这样做。下面是实现所需效果的示例代码(我在
Beans.java
)中提供:

@Bean
public ObjectMapper jacksonObjectMapper() {
    return new ObjectMapper().setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}

如果要将其用于单个类,可以将与一起使用,如下所示:

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

    String businessName;
    String businessLegalName;

}
将序列化为:

{
    "business_name" : "",
    "business_legal_name" : ""
}
由于
Jackson 2.7
中的
小写字母策略
已被弃用,转而支持
SnakeCaseStrategy
,因此您应该使用:

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

    String businessName;
    String businessLegalName;

}

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

spring.jackson.property命名策略=SNAKE\u案例

或使用此注释对模型类进行注释

@JsonNaming(PropertyNameingStrategy.SnakeCaseStrategy.class)


当前的最佳做法是在
应用程序.yml
(或
属性
)文件中配置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 library的两种策略:

杰克逊2.6版。*

ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
ObjectMapper objMapper = new ObjectMapper(new JsonFactory()); // or YAMLFactory()
objMapper.setNamingStrategy(
     PropertyNamingStrategy.SNAKE_CASE);
杰克逊2.7版。*

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

在我看来,注释所有模型类是一种过激的行为,而肯尼的答案对我来说并不适用。序列化的结果仍然是驼峰式的

我意识到我的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);
    }
}
@配置
@EnableWebMvc
公共类WebConfig实现WebMVCConfiguer{
@凌驾

public void configureMessageConverters(列表以注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
而不是:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)


它从2.12开始就被弃用了。

注意,这只是在Jackson 1.9中引入的。@2.7之后弃用的是SNAKE_CASE;一个qq:当我使用SNAKE_CASE命名策略时,带下划线的json文件会被反序列化为camel CASE吗?@Ramswaroop是的,这使得Jackson既会说话,也会期待SNAKE_CASE,因为Jackson 2.12它是
属性yNamingStrategies.SNAKE\u CASE
不要这样做,否则你必须对每个属性都这样做。请参阅下面HPI的响应。我只能对一个属性进行注释,但它确实改变了生成字符串中属性的顺序:注释属性最后出现。(Jackson 2.3.0)@Ryansillington-如果我错了,请纠正我,但如果您正在解析的JSON字符串未使用一致的格式,即同时使用camelCase和下划线,则这是您唯一的选择?@DavidR这是正确的。我假设您无法修复源数据?这太糟糕了。@PaulTsai好的,请随意使用它们:)Spring Boot的另一种选择是,如果您使用的是Spring Boot@zapl是的,您是对的,我可能提到了jackson的版本而不是Spring Boot的版本。让我删除该注释以避免混淆。从jackson的2.7版开始,这是SNAKE_案例。这对我有效:
final ObjectMapper ObjectMapper=new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
如果我用“@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)”注释我的类,它会工作。但如果我在“application.properties”中使用“spring.jackson.property namingstrategy=SNAKE_CASE_CASE”,它不会工作。我正在使用“spring Boot(v2.0.0.0.BUILD-SNAPSHOT)”你有什么想法吗?这里一样,
spring.jackson.property naming strategy=SNAKE_CASE
不起作用,我用的是spring.jackson.property naming strategy=SNAKE_CASE不起作用,我用的是spring.0.5使用@Bean方法创建一个@Configuration类,该类返回一个ObjectMapper。不确定这是否必要。我正在使用Spring boot 2.4.1和
Spring.jackson.property naming strategy=SNAKE\u CASE
为meDo工作。你知道你是否有另一个jackson2objectmapper实例正在加载并覆盖这个实例吗?你能确认吗正在加载他的bean?也可以尝试一下DuffJ的解决方案。这很相似。我认为调整属性是正确的方法;也是推荐的。这与此相同。@WesternGun很好。如果可能,我倾向于通过yaml/properties来实现这一点。他们再次反对某些值,现在他们有了烤肉串案例,yum!FTR:烤肉串案例不是snake_案;-)