【问题标题】:Object type remains as LinkedHashMap after assignment赋值后对象类型保持为 LinkedHashMap
【发布时间】:2020-04-09 15:21:48
【问题描述】:

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

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

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

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

但无法这样做。出现以下错误:

无法将 LinkedHashMap 转换为 List。

获取数据并尝试将其分配给 List

的方法
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 列表。为什么? 我怎样才能把它变成一个数据列表呢?

由于它不映射为列表,我无法执行如下操作。

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;
    }   
}

编辑:

这是List里面的数据格式

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.a.a.a.a.a.Data类】(通过引用链: com.b.b.b.b.b.b.AllDataFromFile["feature"]->java.util.LinkedHashMap["100"]->java.util.LinkedHashMap["DATA1"]->java.util.ArrayList[0])

【问题讨论】:

  • 打印LinkedHashMap。它包含什么?
  • @SotiriosDelimanolis 它包含我的标头和 someId 值。
  • 那么你的 JSON 不包含数组。它包含一个对象值。
  • @SotiriosDelimanolis 不是列表。请参阅上述帖子中的编辑部分以查看结构。这就是现在 dataList 中的值。
  • 哦,我误会了。我以为你的意思是 allData.get("DATA1") 正在返回 LinkedHashMap。您是说它返回 List&lt;LinkedHashMap&gt; 而不是 List&lt;Data&gt;。您如何期望 Jackson 知道它应该将 JSON 数组反序列化为 Data 实例列表?你的类层次结构中没有任何东西可以做到这一点。

标签: java jackson


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。试过你的建议。它抛出一个错误。如果我尝试使用私有 Map> 功能;它可以工作,但没有任何意义,因为它回到了预期的 LinkedHashMap。抛出的错误是:无法读取 JSON:Class java.util.LinkedHashMap not subtype of [simple type, class com.a.a.a.a.a.Data](通过引用链:com.b.b.b.b.b.b.AllDataFromFile["feature"]->java.util.LinkedHashMap ["100"]->java.util.LinkedHashMap["DATA1"]->java.util.ArrayList[0]) 字段肯定匹配。
  • 忽略上面,它适用于您的解决方案。其他问题是由于一些缓存问题。谢谢。
猜你喜欢
  • 2015-09-26
  • 2019-04-19
  • 2018-02-11
  • 2015-01-21
  • 2021-05-21
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多