如何使用 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;
但是,我尝试获取数组名称的列表/数组(A
和 B
)、id
和 logo
属性,但我失败了。这是我尝试做的:
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
获取id
和logo
。我试图迭代myObject.values()
和myObject.entrySet()
,但没有人给我我想要的。
我以更好的方式编辑帖子。我把所有的类代码放在那里。测试并告诉我是否一切正常。以上是关于如何使用 Jackson 反序列化来自 json 对象的对象数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jackson json 注释枚举字段以进行反序列化
如何使用 Jackson 将原始 JSON 反序列化为 Java 对象