Java 杰克逊强调支持骆驼案
我从internet检索JSON字符串;像我见过的大多数JSON一样,它包含由下划线分隔的长键。本质上,我的目标是将JSON反序列化为java对象,但我在java代码中不使用下划线 例如,在camel case中,我可能有一个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
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_案;-)