【问题标题】:Jackson don't automatically convert complexy names of fields from json-object into dto-objectJackson 不会自动将复杂的字段名称从 json-object 转换为 dto-object
【发布时间】:2020-12-22 08:58:20
【问题描述】:

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 注释说自己如何修复它。我认为您还可以使用 .setPropertyNamingStrategy() 方法为您的 objectMapper 配置命名策略
  • (...JsonProperty annotation.) - 我有包含大量字段的对象,因此不能将其放在字段上方
  • 然后使用映射器中的全局配置。

标签: spring-boot rest jackson


【解决方案1】:

我认为我们不能谈论“影响”。我认为这是关于杰克逊的默认配置。如果您想要不同的行为,您必须使用 @JsonProperty 注释或使用 objectMapper.setPropertyNamingStrategy(my strategy here) 进行全局配置。

【讨论】:

  • ....开箱即用,它总是使用复合词没有任何问题,我刚刚遇到这种情况(虽然我可能不记得,我可能已经遇到过这种情况,但我不重视)
  • @skyho 我不确定你所说的“复合词”是什么意思。我的意思是,如果案例不符合策略,它就行不通。考虑到您有 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 如果名称与策略不匹配,我认为它只会被视为未知属性并且将被忽略。
  • “复合词”,例如 - 'key_id' 或 'server_port_id'
  • @skyho 是命名策略的全局配置然后解决您的问题吗?
  • @skyho 如果它解决了您的问题,您会接受我的回答吗? :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
相关资源
最近更新 更多