假设我有以下json:
{
"page": 2,
"per_page": 3,
"total": 12,
"total_pages": 4,
"data": [
{
"id": 4,
"first_name": "Eve",
"last_name": "Holt",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/marcoramires/128.jpg"
},
{
"id": 5,
"first_name": "Charles",
"last_name": "Morris",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/stephenmoon/128.jpg"
},
{
"id": 6,
"first_name": "Tracey",
"last_name": "Ramos",
"avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/bigmancho/128.jpg"
}]}
我只想提取属于id = 6的“ first_name”的值。
我可以用其他方法解决这个问题,但是我想知道是否有一种放心的方法
到目前为止,我已经尝试过以下方法: data.find {it.id =='6'} .first_name
有可能吗?如果为真,该怎么做? 谢谢。
答案 0 :(得分:1)
我不确定该解决方案是否是您要寻找的解决方案,但是您绝对可以根据ID提取名字。
使用JsonPath
中的Rest Assured
库。您可以将JSON作为字符串JsonPath.from("json string")
传递,也可以像这样从Response
获取JSON:
JsonPath path = response.jsonPath();
然后,您可以获得data
数组并像这样迭代其元素:
List<HashMap<String, Object>> data = path.getList("data");
for (HashMap<String, Object> singleObject : data) {
if (singleObject.get("id").equals(6)) {
System.out.println(singleObject.get("first_name"));
}
}
上面将在控制台上打印名称“ Tracey”。 您可以使用此代码,也可以创建一种基于id的返回参数的方法,如下所示:
private static String getFirstNameById(JsonPath path, int id) {
List<HashMap<String, Object>> data = path.getList("data");
for (HashMap<String, Object> singleObject : data) {
if (singleObject.get("id").equals(id)) {
return (String) singleObject.get("first_name");
}
}
throw new NoSuchElementException(String.format("Can't find first_name with id: %d", id));
}
只需确保您了解-data
数组中的每个元素都是JSON对象。我们使用方法getList
收集所有对象。每个对象都由HashMap
和String
中的Object
表示,因为它包含不同的类型。 first_name
是String,id
是Integer,这就是为什么我们必须使用Objects
的HashMap作为第二个通用参数的原因。
然后我们遍历HashMap,比较每个JSON对象的id
以获得所需的结果。
如果愿意,您也可以使用Java Stream
。相同的方法如下所示:
List<HashMap<String, Object>> data = JsonPath.from(json).getList("data");
Optional<String> firstName = data.stream().filter(x -> x.get("id").equals(6)).map(x -> (String) x.get("first_name")).findFirst();
if (firstName.isPresent()) {
System.out.println(firstName.get());
}
答案 1 :(得分:0)
在JsonPath下使用,它将根据ID为您提供first_name:
[?(@.id ==4)].first_name