Jackson@JsonProperty(“SoMeVaLuE”)忽略大小写

sg24os4d  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(147)
  • 我想达到的目标 *

使用Jackson和JsonProperty解析一个json,然而,键虽然总是相同的,但有各种各样的大小写。

  • 我所尝试的 *

输入json具有字段{"field": "value"}
所以,在我的POJO中,我这样做:
public record MyPojo(@JsonProperty("field") String field
这是可行的,但关键是不同类型的案件。
{"fieLd": "value"}{"Field": "value"}{"fIEld": "value"}
现在,我使用@JsonAlias("fieLd")等。
但这是不可扩展的,因为有许多情况的排列。

  • 问题:*

如何告诉Jackson和JsonProperty简单地忽略这个案例?

g9icjywg

g9icjywg1#

我建议在Jackons将jsonMap到对象之前,将json放入某种预处理步骤,以规范化属性Names

public class CustomDeserializer extends JsonDeserializer<MyObject> {
   @Override
   public MyObject deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
       ObjectCodec codec = jsonParser.getCodec();
       JsonNode node = codec.readTree(jsonParser);
       ObjectNode normalizedNode = JsonNodeFactory.instance.objectNode();

       // Normalize property names
       Iterator<String> fieldNames = node.fieldNames();
       while (fieldNames.hasNext()) {
           String originalPropertyName = fieldNames.next();
           String normalizedPropertyName = normalizePropertyName(originalPropertyName);
           normalizedNode.set(normalizedPropertyName, node.get(originalPropertyName));
       }

       ObjectMapper mapper = (ObjectMapper) codec;
       JsonParser modifiedJsonParser = mapper.treeAsTokens(normalizedNode);
       return mapper.readValue(modifiedJsonParser, MyObject.class);
   }

   private String normalizePropertyName(String propertyName) {
       // Perform your normalization logic here
       // For example, convert to lowercase or replace spaces with underscores
       return propertyName.toLowerCase().replaceAll(" ", "_");
   }
}

然后按照您认为合适的方式连接反序列化器,例如通过注解目标Class

@JsonDeserialize(using = CustomDeserializer.class)
public class MyObject {
    // ...
}

相关问题