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

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

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

当前回答

如果它是一个弹簧启动应用程序,在应用程序。属性文件,使用即可

spring.jackson.property-naming-strategy = SNAKE_CASE

或者用这个注释注释模型类。

@JsonNaming PropertyNamingStrategy.SnakeCaseStrategy.class)

其他回答

注释所有的模型类在我看来是一个过度和肯尼的答案不适合我https://stackoverflow.com/a/43271115/4437153。系列化的结果仍然是驼峰情况。

我意识到我的弹簧配置有问题,所以我必须从另一个方面解决这个问题。希望有人觉得它有用,但如果我做了一些违反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);
    }
}

如果它是一个弹簧启动应用程序,在应用程序。属性文件,使用即可

spring.jackson.property-naming-strategy = SNAKE_CASE

或者用这个注释注释模型类。

@JsonNaming PropertyNamingStrategy.SnakeCaseStrategy.class)

为了注释模型类使用:

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)

而不是:

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

自2.12以来已弃用。

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

}

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

上面关于@JsonProperty和camel_case_to_lower_case_with_下划线的答案是100%准确的,尽管有些人(比如我)可能会尝试在基于代码的配置的Spring MVC应用程序中这样做。下面是示例代码(我在Beans.java中有),以达到预期的效果:

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