使用 jackson ObjectMapper 序列化/反序列化不区分大小写的映射

问题描述 投票:0回答:1

我正在尝试使用 Jackson 的

ObjectMapper
类来序列化一个如下所示的对象:

TreeMap<String, String> mappings = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

但是当对象被序列化时,它最终看起来像这样:

{"mappings": {"key": "value"}}

反序列化时,它会丢失地图不区分大小写的属性。有谁知道如何解决这个问题或可能是一种不区分大小写的映射类,我可以用它来序列化和反序列化?是否有杰克逊映射器属性可以用来解决此问题?

这是一些示例代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.TreeMap;

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        TreeMap<String, String> mappings = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
        mappings.put("Test3", "3");
        mappings.put("test1", "1");
        mappings.put("Test2", "2");

        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(mappings);
        System.out.println(json);
        
        TreeMap<String, String> deserMappings = objectMapper.readValue(json, TreeMap.class);
        
        System.out.println("Deserialized map case insensitive test: " + deserMappings.get("test3"));
    }
}

示例输出:

{
  "test1" : "1",
  "Test2" : "2",
  "Test3" : "3"
}
Deserialized map case insensitive test: null
java serialization jackson deserialization
1个回答
1
投票

我认为您误解了格式化参数。它描述了一种您想要 ignore case 的情况,这就是它正在做的事情,忽略您拥有以“T”和“t”开头的键值这一事实。它将所有这些都视为同一案例并按顺序排列。对象调用还允许您定义自己的排序比较器。如果你想做一些特别的事情,你可以使用这个。

https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html#TreeMap-java.util.Comparator-

© www.soinside.com 2019 - 2024. All rights reserved.