Jackson 不会自动将复杂的字段名称从 json-object 转换为 dto-object
Jackson don't automatically convert complexy names of fields from json-object into dto-object
Jackson 不会自动将字段的复杂名称从 json-object 转换为 dto-object。
我收到了一个请求
@PostMapping(path = "model/byFile")
public ResponseEntity<ModelDto>
createModel(@RequestBody List<DataFileDto> modelList) {
}
- dto
public class DataFileDto {
@NotNull
String kyId;
@NotNull
String nameAs;
//default constructor
//getters and setter
//Builder
}
当json到达的时候,转换的时候,Jackson把值取出来只放在简单的词中,但是在复合词中写null。
为了避免这种情况,我必须使用 @JsonProperty("ky_id") 属性,我觉得这很不方便。该项目本身很旧。我不能在那里添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
或
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0</version>
</dependency>
因为那样项目就会中断。
我还注意到那里设置了自定义 ObjectMapper 配置。
@Bean
public ObjectMapper mapper() {
var module = new SimpleModule();
module.addSerializer(BigDecimal.class, new BigDecimalSerializer());
var objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(module);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true);
return objectMapper;
}
更新
我加了
...
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
...
谢谢
尽管存在 setter 和 getter,但 Jackson 无法正确使用复合词这一事实可能会受到什么影响?
如何解决这个问题?
我认为我们不能谈论“影响”。我认为这是关于杰克逊的默认配置。如果你想要不同的行为,你要么使用 @JsonProperty
注释,要么使用 objectMapper.setPropertyNamingStrategy(my strategy here)
.
进行全局配置
Jackson 不会自动将字段的复杂名称从 json-object 转换为 dto-object。
我收到了一个请求
@PostMapping(path = "model/byFile")
public ResponseEntity<ModelDto>
createModel(@RequestBody List<DataFileDto> modelList) {
}
- dto
public class DataFileDto {
@NotNull
String kyId;
@NotNull
String nameAs;
//default constructor
//getters and setter
//Builder
}
当json到达的时候,转换的时候,Jackson把值取出来只放在简单的词中,但是在复合词中写null。
为了避免这种情况,我必须使用 @JsonProperty("ky_id") 属性,我觉得这很不方便。该项目本身很旧。我不能在那里添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
或
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.0</version>
</dependency>
因为那样项目就会中断。
我还注意到那里设置了自定义 ObjectMapper 配置。
@Bean
public ObjectMapper mapper() {
var module = new SimpleModule();
module.addSerializer(BigDecimal.class, new BigDecimalSerializer());
var objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(module);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true);
return objectMapper;
}
更新
我加了
...
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
...
谢谢
尽管存在 setter 和 getter,但 Jackson 无法正确使用复合词这一事实可能会受到什么影响?
如何解决这个问题?
我认为我们不能谈论“影响”。我认为这是关于杰克逊的默认配置。如果你想要不同的行为,你要么使用 @JsonProperty
注释,要么使用 objectMapper.setPropertyNamingStrategy(my strategy here)
.