java - 赋值后对象类型保持为 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])
解决方案
Jackson 也使用反射来确定需要反序列化的类型。
但是从AllDataFromFile开始,并不能确定内容实际上是一个Data对象的List,所以回退到默认的Lists(ArrayList)和Maps(LinkedHashMap)。
我认为如果您在类型声明中提供更多信息,杰克逊可能会弄清楚:
public class AllDataFromFile {
private Map<String, Map<String, List<Data>>> feature;
}
推荐阅读
- php - 在 slim 中设置 .htaccess 文件
- python-3.x - 使用 Python 3 替换 csv 文件中的一行
- c++-winrt - winrt 有标准的字体对话框吗?
- sql - 在行上排列
- c# - 有哪些方法可以模拟结构以在单元测试中获取类?
- web-component - 如何附加以编程方式创建的 Web 组件?
- tla+ - 从对称集合中选择一项
- c++ - 如何以编程方式设置应用程序 EXE 文件的图标?
- python - 编译列表:python 最佳实践
- internet-explorer - 在 Ember.js 中填充 Object.entries 的推荐方法是什么?