将复杂的 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 items = parentObject.getItems(); 你定义了getItems方法吗? 是的,我做到了,就像你在编辑中所做的那样。我已经添加了@JsonProperty("items")。编辑:好的,等等。我搞砸了。等一下,它现在似乎可以工作了。 谢谢 :) 现在可以完美运行了。如果可以的话 - 我还有一个问题:我现在应该怎么做,例如,如果我只想打印 otherId/first 等于“xyz”的这些项目?我应该做类似“parentObject.getItems().get() [...]”的事情吗? 没问题。对于第二个问题,您是否想知道如何遍历数组列表并仅打印出符合特定条件的内容?这听起来与这篇文章无关。您可能想单独进行搜索或发布另一个问题。

以上是关于将复杂的 json 文件反序列化为 POJO - 作为一个列表元素工作,或者不作为的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON-B / Yasson 将 JSON 反序列化为多态 POJO

使用spring boot将JSON反序列化为带有通用对象列表的POJO

Jackson 使用枚举键、POJO 值反序列化为 Map

Spring 尝试反序列化为 LinkedHashMap 而不是 POJO

如何使用 Jackson 将原始 JSON 反序列化为 Java 对象

将hal+json反序列化为复杂模型