假设我有以下 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
这可能吗?如果是真的,该怎么办? 谢谢。
最佳答案
我不确定这个解决方案是否是您正在寻找的,但您绝对可以根据 id 提取名字。
在放心
中使用JsonPath
库。您可以将 JSON 作为字符串 JsonPath.from("json string")
传递,也可以从 Response
获取它,如下所示:
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 方法收集所有对象。每个对象都由String
和Object
的HashMap
表示,因为它包含不同的类型。 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());
}
关于java - 请放心(JAVA): Extract json object value given it's parent object value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56237269/