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

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

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

当前回答

如果你想要一个类,你可以使用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和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);
}

在Jackson 2.12+中,您可以配置ObjectMapper将驼号大小写转换为带下划线的名称:

objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

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

@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class;)

在Jackson 2.7之前,这个常数被命名为:

PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

@JsonNaming的PropertyNamingStrategy应该替换为PropertyNamingStrategies

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

spring.jackson.property-naming-strategy = SNAKE_CASE

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

@JsonNaming PropertyNamingStrategy.SnakeCaseStrategy.class)

以下是两个不同版本Jackson库的两种策略:

对于杰克逊2.6

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

对于Jackson 2.7.*

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