如何从嵌套JSON响应中正确提取指定键值(如RequestID)

本文详解如何在Java中通过org.json库安全、准确地从多层嵌套JSON结构中提取深层字段(如CaseResult内的RequestID),避免因路径字符串误用导致的JSONException。

本文详解如何在Java中通过org.json库安全、准确地从多层嵌套JSON结构中提取深层字段(如CaseResult内的RequestID),避免因路径字符串误用导致的JSONException。

在调用RESTful API时,开发者常需从返回的嵌套JSON中提取特定字段。但需注意:org.json库不支持点号路径语法(如"Data[0].CaseData.CaseResult.RequestID")——该写法会被视为一个完整的字符串键名,而非导航路径,因此抛出JSONException: JSONObject["xxx"] not found。

正确的做法是逐级解析JSON结构,利用getJSONObject()、getJSONArray()和getString()等方法链式访问目标字段。以下为完整、健壮的实现示例:

import org.json.*;

public class JsonRequestIDExtractor {
    public static String extractRequestID(String jsonResponse) {
        try {
            JSONObject root = new JSONObject(jsonResponse);

            // 1. 获取 Data 数组(必须先校验存在性)
            if (!root.has("Data") || root.getJSONArray("Data").length() == 0) {
                throw new IllegalArgumentException("Data array is missing or empty");
            }
            JSONArray dataArray = root.getJSONArray("Data");

            // 2. 获取第一个元素(索引0),并确保其为 JSONObject
            JSONObject dataItem = dataArray.getJSONObject(0);

            // 3. 逐层进入嵌套对象
            JSONObject caseData = dataItem.getJSONObject("CaseData");
            JSONObject caseResult = caseData.getJSONObject("CaseResult");

            // 4. 提取最终目标字段
            return caseResult.getString("RequestID");

        } catch (JSONException e) {
            throw new RuntimeException("Failed to parse RequestID from JSON response", e);
        }
    }

    // 使用示例
    public static void main(String[] args) {
        String response = """
            {
              "Status":1,
              "RequestID":"29d2d52c-e8fe-447f-9ee1-15e4624be58f",
              "Data":[
                {
                  "RegNumber":"ASD3948506",
                  "CaseData":{
                    "CaseResult":{
                      "Message":"success",
                      "RequestID":"8C15473C0F7771F410928D5D91362B80"
                    },
                    "ErrorMessageList":[]
                  }
                }
              ]
            }
            """;

        String requestId = extractRequestID(response);
        System.out.println("Extracted RequestID: " + requestId); // 输出:8C15473C0F7771F410928D5D91362B80
    }
}

关键注意事项:

若需更灵活的路径查询(如支持$.Data[0].CaseData.CaseResult.RequestID),可考虑引入第三方库如Jackson(配合JsonPointer)或JsonPath,但对轻量场景,原生org.json链式调用已足够清晰、高效且无额外依赖。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。