将复杂的 json 文件反序列化为 POJO - 作为一个列表元素工作,或者不作为
Posted
技术标签:
【中文标题】将复杂的 json 文件反序列化为 POJO - 作为一个列表元素工作,或者不作为【英文标题】:Deserializing complex json file into a POJO - works either as one list element, or doesn't 【发布时间】:2019-08-21 11:17:03 【问题描述】:我正在尝试将此 json 反序列化为 POJO 类,这样我就可以管理对象了。 JSON:
"something": "x",
"items": [
"type": "y",
"id": "123",
"otherInfo":
"tag": "abc",
"otherId": [
"first": "qaz",
"second": "zaq"
,
[...]
有10多个这样的元素。 我想反序列化它,所以我使用了 jsonschema2pojo,使用 getter、setter 和构造函数创建了像 Item 和 otherInfo 这样的类。
然后我在我的 DAO 类中创建了一个 ObjectMapper:
ObjectMapper mapper = new ObjectMapper();
Item items;
try
items = mapper.readValue(new File("path/file.json"), Item.class);
catch (IOException e)
e.printStackTrace();
public Item getAllItems()
return items;
这样我得到一个空输出。 将 Item 更改为 Item[] 时,我收到“MismatchedInputException”,因为 JSON 中“items”上方的“某物”。
当我尝试引用比 Item 高一级的 POJO 类时,我将整个 JSON 作为单个数组元素,其中包含所有内容。这很明显,但这表明 ObjectMapper 工作正常。
有什么简单或有效的方法来反序列化 JSON 吗?
【问题讨论】:
为什么要注意再创建一个具有属性“Something”和项目列表的父类,然后尝试反序列化该父对象? 感谢您的回复。也许这是一个选择。您能否提供有关反序列化父对象的更多信息?我不认为我完全明白你的意思。顺便提一句。有没有办法“跳过”“某事”而只是反序列化所有项目?编辑:实际上,它甚至没有完全删除“某物”... 【参考方案1】:您可以创建一个包含 ArrayList 的父对象来表示 Item 数组。
例如:
public class MyParentObject
String something;
ArrayList<Item> items;
public ArrayList<Item> getItems()
return items;
// the rest of your getters/setters
// the object mapper line becomes:
MyParentObject parentObject = mapper.readValue(new File("path/file.json"), MyParentObject.class);
ArrayList<Item> items = parentObject.getItems();
通过 JSON 反序列化,可以将 JSON 数组直接映射到 ArrayList。
【讨论】:
感谢您的回复。我试图实现这个解决方案,我得到“非静态方法 getItems() 不能从静态上下文引用”指向 ArrayList以上是关于将复杂的 json 文件反序列化为 POJO - 作为一个列表元素工作,或者不作为的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSON-B / Yasson 将 JSON 反序列化为多态 POJO
使用spring boot将JSON反序列化为带有通用对象列表的POJO
Spring 尝试反序列化为 LinkedHashMap 而不是 POJO