使用org.json在Java中遍历JSON并提取NEW状态的taskId
问题
我收到如下JSON响应,需要遍历并提取状态(status)为NEW对应的taskId。之前用Groovy实现,现在要求必须使用org.json库,但我写的代码无法正常运行,期望输出结果为221,请求协助解决。
附上我当前尝试的代码:
import org.json.JSONArray; import org.json.JSONObject; // create JSONExample class to iterate JSON Array public class JSONExample{ //main() method start public static void main(String args[]){ // create an string of JSON data String jsonData="{" + " \"document-payload\": [" + " {" + " \"document-name\": \"taskDetails\"," + " \"payload\": {" + " \"attributes\": [" + " {" + " \"name\": \"status\"," + " \"value\": \"CLOSED\"" + " }," + " {" + " \"name\": \"message\"," + " \"value\": \"\"" + " }," + " {" + " \"name\": \"taskId\"," + " \"value\": \"218\"" + " }" + " ]" + " }," + " \"created\": \"2024-03-07 22:00:49.695202\"," + " \"modified\": \"2024-03-07 22:00:49.695202\"," + " \"headers\": {" + " \"taskName\": \"Testing\"" + " }" + " }," + " {" + " \"document-name\": \"taskDetails\"," + " \"payload\": {" + " \"attributes\": [" + " {" + " \"name\": \"status\"," + " \"value\": \"NEW\"" + " }," + " {" + " \"name\": \"message\"," + " \"value\": \"\"" + " }," + " {" + " \"name\": \"taskId\"," + " \"value\": \"221\"" + " }" + " ]" + " }," + " \"created\": \"2024-03-07 22:00:49.695202\"," + " \"modified\": \"2024-03-07 22:00:49.695202\"," + " \"headers\": {" + " \"taskName\": \"Testing\"" + " }" + " }" + "]" + "}"; String data = jsonData.replaceAll("\\s", ""); System.out.println(data); JSONObject jobj = new JSONObject(data); JSONObject parent = jobj.getJSONObject("payload"); JSONArray jarr = parent.getJSONArray("attributes"); for (int i = 0; i < jarr.length(); i++) { for (int j = 0; j < jarr.length(); j++) { JSONObject test1 = jarr.getJSONObject(j); System.out.println(test1); } } } }
解决方案
你的代码存在几个关键问题:
- JSON结构解析错误:根对象里没有直接的
payload字段,实际要先获取document-payload数组,数组里的每个元素才包含payload和对应的attributes - 嵌套循环逻辑错误:内层循环重复遍历同一个
attributes数组,且没有实现状态判断和taskId提取逻辑 - 不必要的空格清除:
org.json库可以直接解析带空格的JSON,不需要调用replaceAll("\\s", "")
修正后的代码如下:
import org.json.JSONArray; import org.json.JSONObject; public class JSONExample { public static void main(String args[]) { String jsonData = "{" + " \"document-payload\": [" + " {" + " \"document-name\": \"taskDetails\"," + " \"payload\": {" + " \"attributes\": [" + " {" + " \"name\": \"status\"," + " \"value\": \"CLOSED\"" + " }," + " {" + " \"name\": \"message\"," + " \"value\": \"\"" + " }," + " {" + " \"name\": \"taskId\"," + " \"value\": \"218\"" + " }" + " ]" + " }," + " \"created\": \"2024-03-07 22:00:49.695202\"," + " \"modified\": \"2024-03-07 22:00:49.695202\"," + " \"headers\": {" + " \"taskName\": \"Testing\"" + " }" + " }," + " {" + " \"document-name\": \"taskDetails\"," + " \"payload\": {" + " \"attributes\": [" + " {" + " \"name\": \"status\"," + " \"value\": \"NEW\"" + " }," + " {" + " \"name\": \"message\"," + " \"value\": \"\"" + " }," + " {" + " \"name\": \"taskId\"," + " \"value\": \"221\"" + " }" + " ]" + " }," + " \"created\": \"2024-03-07 22:00:49.695202\"," + " \"modified\": \"2024-03-07 22:00:49.695202\"," + " \"headers\": {" + " \"taskName\": \"Testing\"" + " }" + " }" + "]" + "}"; JSONObject rootObj = new JSONObject(jsonData); // 获取document-payload数组 JSONArray taskArray = rootObj.getJSONArray("document-payload"); for (int i = 0; i < taskArray.length(); i++) { JSONObject taskItem = taskArray.getJSONObject(i); JSONObject payload = taskItem.getJSONObject("payload"); JSONArray attributes = payload.getJSONArray("attributes"); String currentStatus = null; String currentTaskId = null; // 遍历当前任务的属性,提取status和taskId for (int j = 0; j < attributes.length(); j++) { JSONObject attr = attributes.getJSONObject(j); String name = attr.getString("name"); String value = attr.getString("value"); if ("status".equals(name)) { currentStatus = value; } else if ("taskId".equals(name)) { currentTaskId = value; } } // 判断状态为NEW时输出taskId if ("NEW".equals(currentStatus)) { System.out.println(currentTaskId); // 如果只需要第一个匹配项,这里可以break退出循环 // break; } } } }
代码说明
- 直接解析原始JSON字符串,无需清除空格
- 先获取根对象中的
document-payload数组,遍历每个任务条目 - 对每个任务条目,提取其
payload下的attributes数组 - 遍历属性数组,分别记录当前任务的
status和taskId - 当
status等于NEW时,输出对应的taskId
内容的提问来源于stack exchange,提问作者Raja Pandian
相关产品推荐
相关产品推荐

