Java使用JSONArray、JSONObject解析嵌套复杂JSON响应获取字段值
嵌套JSON解析方法(基于org.json的JSONArray/JSONObject实现)
你现有代码有两个问题:
- 循环变量书写错误:定义的循环变量是小写
j,递增逻辑里写了大写J++,会直接触发编译错误 - 解析层级不够:调用
jarr.getString("BCD")只会把BCD对应的整个嵌套对象转成字符串返回,不会继续向内解析拿到CDE的值。
JSON解析是逐层匹配key的过程,嵌套对象只需要多调用一次getJSONObject拿到内层对象,再取目标字段即可,完整步骤如下:
- 先将原始JSON响应字符串解析为最外层的根JSONObject
- 从根节点直接获取key为
ABC的JSONArray,不需要额外调用toString做二次转换,用内置的getJSONArray方法更稳定 - 遍历JSONArray,拿到数组中存储的每一个JSONObject元素
- 从当前元素中获取key为
BCD的嵌套JSONObject - 最后从BCD对应的内层对象中,获取key为
CDE的字段值
可直接运行的参考代码:
import org.json.JSONArray; import org.json.JSONObject; public class JsonParseTest { public static void main(String[] args) { // 原始JSON响应 String jsonResponse = "{\n" + " \"ABC\": [\n" + " {\n" + " \"BCD\": {\n" + " \"CDE\": \"HIJ\"\n" + " }\n" + " }\n" + " ]\n" + "}"; // 解析根节点 JSONObject root = new JSONObject(jsonResponse); // 获取ABC对应数组 JSONArray abcArray = root.getJSONArray("ABC"); for (int i = 0; i < abcArray.length(); i++) { // 取数组内的单个元素对象 JSONObject arrayItem = abcArray.getJSONObject(i); // 取内层BCD对象 JSONObject bcdObj = arrayItem.getJSONObject("BCD"); // 取目标CDE字段值 String cdeVal = bcdObj.getString("CDE"); // 控制台输出结果为 HIJ System.out.println(cdeVal); } } }
解析容错提示:如果无法保证JSON结构完全固定,建议使用
optJSONObject()、optString()系列方法,可设置默认值,避免字段缺失、类型不匹配时直接抛出异常。例如bcdObj.optString("CDE", "")表示CDE字段不存在时默认返回空字符串。
内容的提问来源于stack exchange,提问作者Vidya B.
相关产品推荐
相关产品推荐

