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

使用JSONObject解析请求返回JSON时触发IllegalAccessException及JSON数组属性提取方案咨询

解决JSON解析异常并提取目标属性值的方法

一、先拆解你遇到的核心问题

  1. IllegalAccessException异常根源:
    这个错误主要是因为你使用的org.json库版本和Java 9+的模块化机制不兼容,导致底层反射访问Java核心类的私有成员时被权限限制。另外也要确认response.getBody()返回的确实是字符串格式的JSON内容,如果是InputStream这类非字符串类型直接传入JSONObject构造器,也可能触发奇怪的反射错误。

  2. 解析逻辑的明显错误:
    你的示例JSON里,data是一个JSONObject对象,但你代码里误用了jsonObj.getJSONArray("data"),这本身就会引发类型不匹配错误,也是后续问题的诱因之一。


二、完整解决方案

1. 修复依赖版本(解决权限异常)

如果你用Maven/Gradle管理依赖,确保使用适配Java 9+的org.json稳定版本:

<!-- Maven依赖示例 -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20231013</version>
</dependency>

2. 修正JSON解析逻辑(提取目标值)

按照你的JSON结构,正确的解析路径是:根JSONObject -> data对象 -> Members数组 -> 遍历数组取每个元素的name属性,完整可运行代码如下:

import org.json.JSONArray;
import org.json.JSONObject;
import java.nio.charset.StandardCharsets;

public class GetName {
    public static void main(String[] args) {
        // 模拟接口返回的JSON字符串
        String responseBody = "{ \"data\": { \"Members\": [ { \"id\": \"01\", \"name\": \"new york\" }, { \"id\": \"02\", \"name\": \"chicago\" }, { \"id\": \"03\", \"name\": \"la\" } ] } }";

        try {
            // 1. 将JSON字符串转为根JSONObject
            JSONObject rootObj = new JSONObject(responseBody);
            
            // 2. 获取data对象(注意是getJSONObject,不是getJSONArray)
            JSONObject dataObj = rootObj.getJSONObject("data");
            
            // 3. 获取Members数组
            JSONArray membersArray = dataObj.getJSONArray("Members");
            
            // 4. 遍历数组,提取每个成员的name属性
            for (int i = 0; i < membersArray.length(); i++) {
                JSONObject member = membersArray.getJSONObject(i);
                String cityName = member.getString("name");
                System.out.println(cityName); // 依次输出new york、chicago、la
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 额外注意事项

如果response.getBody()返回的是InputStream而非字符串,需要先将流转换为字符串再传入JSONObject:

// 假设response.getBody()返回的是InputStream
String responseBody = new String(response.getBody().readAllBytes(), StandardCharsets.UTF_8);

内容的提问来源于stack exchange,提问作者developer sw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:07:39