You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
            }
        }
    }
}

代码说明

  1. 直接解析原始JSON字符串,无需清除空格
  2. 先获取根对象中的document-payload数组,遍历每个任务条目
  3. 对每个任务条目,提取其payload下的attributes数组
  4. 遍历属性数组,分别记录当前任务的status和taskId
  5. 当status等于NEW时,输出对应的taskId

内容的提问来源于stack exchange,提问作者Raja Pandian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:24:59