如何使用 Jackson 反序列化来自 json 对象的对象数组

Posted

技术标签:

【中文标题】如何使用 Jackson 反序列化来自 json 对象的对象数组【英文标题】:How to use Jackson to deserialise arrays of objects from json object 【发布时间】:2019-02-07 07:25:48 【问题描述】:

我正在尝试使用 Jackson 库反序列化以下 JSON。这个 JSON 与 this question 中提到的非常相似。我的问题是: 如何反序列化以下 JSON?


  "A": [
    
      "id": 16,
      "logo": "QJQSZzbXurElfHYcq6hcbPuaWKVfQU31lx2eSIIr.png",
    ,
    
      "id": 20,
      "logo": "AizaZzbXurElfHYcq6PuaWKV2761lx2eSLESASFr.png",
    
  ],
  "B": [
    
      "id": 42,
      "logo": "tBYhHGTNTCYT60RZJydMyGgg47Tla36ISuRj4p0e.png",
    ,
    
      "id": 44,
      "logo": "kCZveUWo9eqIZc25deE4ln8llxlbBviRolk4PsCm.png",
    
  ]

这里是MonthTree类:

public class MonthTree 
    private int id;
    private String logo;

    public int getId() 
        return id;
    
    public void setId(int id) 
        this.id = id;
    

    public String getLogo() 
        return logo;
    
    public void setLogo(String logo) 
        this.logo = logo;
    

但是,我尝试获取数组名称的列表/数组(AB)、idlogo 属性,但我失败了。这是我尝试做的:

ObjectMapper mapper = new ObjectMapper();
List<MonthTree> monthTrees = mapper.readValue(json_res, new TypeReference<List<MonthTree>>());

所以,我得到了以下异常:

无法从 START_OBJECT 令牌中反序列化 com.talmir.myApp.utils.MonthTree[] 的实例

附言我是这个库的新手,所以不知道这个库还有什么功能。

【问题讨论】:

您没有对象列表,因此您不需要使用“TypeReference”。你能发布你的班级 MonthTree 吗? @BrunoCarletti 我编辑了问题。 “A”和“B”是静态字段吗?或者它们将是一个动态字段?可以出现一个“C”? 不,它们是静态字段,但有可能在 json 中看到另一个“C”、“D”、“E”等。 【参考方案1】:

你可以这样做:

public class MonthTree 

    private int id;
    private String logo;

    public int getId() 
        return id;
    
    public void setId(int id) 
        this.id = id;
    

    public String getLogo() 
        return logo;
    
    public void setLogo(String logo) 
        this.logo = logo;
    
    @Override
    public String toString() 
        return "MonthTree [id=" + id + ", logo=" + logo + "]";
    

    public static void main(String[] args) 
        String json = "\n" + 
                "  \"A\": [\n" + 
                "    \n" + 
                "      \"id\": 16,\n" + 
                "      \"logo\": \"QJQSZzbXurElfHYcq6hcbPuaWKVfQU31lx2eSIIr.png\"\n" + 
                "    ,\n" + 
                "    \n" + 
                "      \"id\": 20,\n" + 
                "      \"logo\": \"AizaZzbXurElfHYcq6PuaWKV2761lx2eSLESASFr.png\"\n" + 
                "    \n" + 
                "  ],\n" + 
                "  \"B\": [\n" + 
                "    \n" + 
                "      \"id\": 42,\n" + 
                "      \"logo\": \"tBYhHGTNTCYT60RZJydMyGgg47Tla36ISuRj4p0e.png\"\n" + 
                "    ,\n" + 
                "    \n" + 
                "      \"id\": 44,\n" + 
                "      \"logo\": \"kCZveUWo9eqIZc25deE4ln8llxlbBviRolk4PsCm.png\"\n" + 
                "    \n" + 
                "  ]\n" + 
                "";

        try 
            ObjectMapper mapper = new ObjectMapper();
            Map<String, List<MonthTree>> map = mapper.readValue(json, new TypeReference<Map<String, List<MonthTree>>>());
            Iterator<String> it = map.keySet().iterator();
            while (it.hasNext()) 
                String letter = (String) it.next();
                List<MonthTree> list = map.get(letter);
                for (MonthTree monthTree : list) 
                    System.out.println("Letter: "+letter+" MonthTree: "+monthTree);
                
            
         catch (IOException e) 
            e.printStackTrace();
        

    


【讨论】:

但是MonthTreeParent 类呢?我们应该在哪里使用它? 第二种方法只适用于我的情况。它帮助我从 json 获取所有数组。但是,另一个问题是关于从myObject 获取idlogo。我试图迭代myObject.values()myObject.entrySet(),但没有人给我我想要的。 我以更好的方式编辑帖子。我把所有的类代码放在那里。测试并告诉我是否一切正常。

以上是关于如何使用 Jackson 反序列化来自 json 对象的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson json 注释枚举字段以进行反序列化

如何在 Jackson 中记录 JSON 反序列化

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

如何根据json中的属性编写jackson反序列化器

如何忽略像“car”这样的空 json 对象:,这会在使用 jackson 反序列化后导致空 pojos

基于来自 JSON 请求主体的另一个属性,反序列化来自 JSON 请求主体的抽象属性