java - 如何更改 Jackson 默认的具体 map 类型?

标签 java jackson

我有一个非常简单的 Jackson 代码来反序列化嵌套的 JSON 对象:

public class MapTest
{
  public static void main(String ... args) throws Exception
  {
    final String ser = "{\"nested\":{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}}";
    final Map<String, Object> deser = new ObjectMapper().readValue(ser, new TypeReference<TreeMap<String, Object>>(){});
    System.out.println("Class of deser's nested object is " + deser.get("nested").getClass().getSimpleName());
  }
}

当我运行它时,我得到以下输出:

Class of deser's nested object is LinkedHashMap

但是我希望将嵌套映射反序列化为 TreeMap 而不是输出中的 LinkedHashMap。我如何告诉 Jackson 在反序列化时默认使用 TreeMap

通过阅读文档,我发现最接近的是能够通过模块中的 addAbstractTypeMapping() 为抽象类型定义具体类,但我已经尝试了 LinkedHashMap 的每个父类(super class)和实例 尝试这样做,但似乎没有任何效果。

这是使用 Jackson 2.4.2,尽管如果有办法做到这一点需要更高版本,我将能够升级。

最佳答案

模块的 addAbstractTypeMapping() 确实是实现一般映射的方法。但问题可能是由于反序列化的递归性质;因为内部值被认为是 java.lang.Object 类型。

但是,我认为在 2.5 中确实对这部分进行了修复,所以我会特别检查一下 2.5.0 是否可以工作,一旦你添加了从 MapTreeMap 的抽象映射。 如果这不起作用,请在 https://github.com/FasterXML/jackson-databind/issues 提交错误因为它应该有效。

关于java - 如何更改 Jackson 默认的具体 map 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28375069/

相关文章:

java - 来自 java 的 PHP Soap 请求

java - 为什么设置ArrayList时不需要返回值?

java - 使用 CyclicBarrier 的 Barrier.await() 之后线程没有继续进行

java - Jackson JsonDeserialize 没有被@QueryParam 调用

java - 将 json 时间戳转换为普通 java 时间戳

java - Apache Commons MultiValuedMap 和 Jackson

java - 如何将一个值从一个类返回到另一个类? java

c# - 将代码从 Java 转换为 C#/ASP.NET

java - 需要在 ORMLite 中保存 JSON 并通过 Jackson 序列化

spring-boot - 类 com.fasterxml.jackson.dataformat.xml.XmlMapper 正在从多个位置加载