此问题在此处已有答案:
Java Stream API - count items of a nested list(3个答案)
8个月前关门了。
我有下面的一段JSON
代码:
{
"films": [{
"id": "12345",
"title": "The Fellowship Of The Ring",
"year": 2001,
"cast": [{
"actor": "Billy Boyd",
"id": "770911234",
"character": "Peregrin Took"
},
{
"actor": "Ian McKellen",
"id": "162659743",
"character": "Gandalf"
}
]
},
{
"id": "67890",
"title": "Spiderman",
"year": 2021,
"cast": [{
"actor": "Tom Holland",
"id": "162660329",
"character": "Spiderman"
}]
}
]
}
我对使用Jackson还是个新手,现在想知道,用Java获取所有电影对象的所有演员的数量的最好方法是什么?是从movies对象解析它,还是创建一个单独的解析方法?
我已经创建了一个JsonFilm POJO
,它包含一个film对象的字段和一个带有getter+setter的JsonFilms
类:
public class JsonFilms {
@JsonProperty("films")
private List<JsonFilms > jsonFilmList = new ArrayList<>();
public List<JsonFilm> getFilmsList() {
return Collections.unmodifiableList(jsonFilmList );
}
public void setFilmsList(List<JsonFilm> jsonFilmList ) {
this.jsonFilmList = jsonFilmList;
}
}
使用ObjectMapper
,我可以检索所有电影:
File jsonFile = new File(filePath);
JsonFilms jsonFilmList = objectMapper.readValue(jsonFile, JsonFilms.class);
3条答案
按热度按时间rnmwe5a21#
您可以创建适当的类,如
Film
和Actor
,并将Json解析为适当的类结构,或者你也可以快速地把它解析成一个Map<String, Object>
,你的Map将只包含一个"films"
键,它将包含一个List<Map<String, Object>>
。你应该遍历这个列表,从列表中的每个Map<String, Object>
中提取一个包含List<Map<String, Object>>
的关键字"cast"
,你总结所有这些列表的长度,这就是你的答案。为了将JSON字符串转换为Map<String, Object>
,可以使用Jackson库,特别是ObjectMapper类及其方法readValue()或者您可以使用提供JsonUtils类的开放源代码库MgntUtils,它是Jackson库的 Package 器。使用该类解析Json字符串时,其外观如下所示:可以在here上找到Maven构件的MgntUtils库,可以在Github here上找到作为jar的库以及Javadoc和源代码
2fjabf4q2#
如果你只需要标题和演员的名字,你可以使用
ObjectMapper.readTree()
。因为JsonNode
实现了Iterable
,你可以使用StreamSupport.stream(node.spliterator(), false)
来stream
所有的值节点。输出量:
6ju8rftf3#
如果允许你添加新的库,那么JsonPath库可以提供帮助。最简单的代码是: