首页 > 解决方案 > 赋值后对象类型保持为 LinkedHashMap

问题描述

我从外部文件源获取以下 JSON 数据。

{
    .... More complicated structures within this JSON format above but I only care about the following
    "feature": {
        "100": {
            "DATA1": [
                {
                    "header": "head1",
                    "someId": "123"
                }
            ]
        }
    }
}

我正在尝试将以下部分捕获为 List < Data >

"DATA1": [
    {
        "header": "head1",
        "someId": "123"
    }
]

但无法这样做。收到以下错误:

无法将 LinkedHashMap 转换为 List。

获取数据并尝试将其分配给 List<Data> 的方法

private void getData(){
    AllDataFromFile all = someFetchAPI(); // Got every JSON data in the file. 

    // capturing the portion that I want which I do get. 
    Map<String, Map<String,Object>> feature = all.getFeature(); 
    Map<String, Object> allData = feature.get("100");
    List<Data> dataList = allData.get("DATA1");
}

上面没有编译或运行时错误,但 dataList 不是数据列表。

相反,当我在调试模式下看到时,它是一个 LinkedHashMap 列表。为什么?我怎样才能把它变成一个数据列表呢?

由于它不映射为 List<Data>,因此我无法执行以下操作。

dataList.get(0).getHeader(). 

也无法投射它并得到同样的错误:

无法将 LinkedHashMap 转换为 List。

请指教。谢谢。

AllDataFromFile 类

@Getter
@Setter
@JsonInclude(Include.NON_NULL)
public class AllDataFromFile {
    private Map<String, Map<String,Object>> feature;
}

数据类

@JsonInclude(Include.NON_NULL)
public class Data implements Comparable<Data>, Cloneable{   
    private String header;
    private String someId;

    @Override
    public int compareTo(Data o) {
        int result = // some logic
        return result;
    }   
}

编辑:

这是列表中的数据格式

result = {ArrayList@18590} size = 1
  0 = {LinkedHashMap@18593} size = 2
    "header" -> "header1"
    "someId" -> "id1"

当我尝试将对象的值匹配为更具体时出现以下错误,如下所示。

private Map<String, Map<String, List<Data>>> feature;

如果我执行以下操作,则能够返回获取 LinkedHashMap (没用,回到 Square one):

private Map<String, Map<String, List>> feature;

错误:

无法读取 JSON:类 java.util.LinkedHashMap 不是 [简单类型,类 com.aaaaaData] 的子类型(通过引用链:com.bbbbbbAllDataFromFile["feature"]->java.util.LinkedHashMap["100"]-> java.util.LinkedHashMap["DATA1"]->java.util.ArrayList[0])

标签: javajackson

解决方案


Jackson 也使用反射来确定需要反序列化的类型。

但是从AllDataFromFile开始,并不能确定内容实际上是一个Data对象的List,所以回退到默认的Lists(ArrayList)和Maps(LinkedHashMap)。

我认为如果您在类型声明中提供更多信息,杰克逊可能会弄清楚:

public class AllDataFromFile {
    private Map<String, Map<String, List<Data>>> feature;
}

推荐阅读