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

Java解析JSON文件:getJSONObject(int)未定义及字段取值问题

解决JSONArray.getJSONObject未定义及获取嵌套字段值的问题

看起来你遇到的问题主要是因为使用的JSON库(应该是org.json.simple)的API和你预期的不一样,再加上原始代码里做了没必要的包装操作,导致取字段时卡壳了。咱们一步步来解决:

问题根源分析

  1. 不必要的数组包装:你的JSON文件内容本身是单个JSON对象({"flowrate":...,"command":...}),但你解析后把它放进了一个新的JSONArray里,这其实是多此一举的操作。
  2. API差异:如果用的是org.json.simple库,它的JSONArray类并没有getJSONObject()方法——这个类继承自ArrayList<Object>,所有元素都以Object类型存储,所以需要手动做强制类型转换。

解决方案一:修正现有代码,获取目标字段

如果坚持要保留这个手动创建的JSONArray,可以通过强制类型转换来获取cancel的值:

JSONParser parser = new JSONParser(); 
Object obj = parser.parse(new FileReader("C:\\myfile.json")); 
JSONArray array= new JSONArray(); 
array.add(obj); 

// 第一步:取出数组里的第一个元素,强制转成JSONObject
JSONObject jsonObject = (JSONObject) array.get(0);
// 第二步:获取"command"对应的子对象
JSONObject commandObj = (JSONObject) jsonObject.get("command");
// 第三步:取出"cancel"的值(注意org.json.simple里数字默认是Long类型)
long cancelValue = (long) commandObj.get("cancel");

System.out.println("cancel的值是:" + cancelValue);

解决方案二:优化代码,直接解析为JSONObject

既然你的源JSON是单个对象,完全不需要包装成数组,直接解析成JSONObject会更简洁:

JSONParser parser = new JSONParser(); 
// 直接把解析结果转成JSONObject
JSONObject rootObj = (JSONObject) parser.parse(new FileReader("C:\\myfile.json")); 

// 直接嵌套获取"command"下的"cancel"
JSONObject commandObj = (JSONObject) rootObj.get("command");
long cancelValue = (long) commandObj.get("cancel");

System.out.println("cancel的值是:" + cancelValue);

额外注意:检查JSON库的导入

如果你之前误以为自己用的是org.json(另一个常用JSON库),那要注意两者API的区别:

  • org.json.simple的导入语句:
    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    
  • org.json库没有JSONParser类,而是用JSONObject.parse()或JSONObject.parseFile()来解析,且它的JSONArray确实有getJSONObject()方法。如果要切换到这个库,代码需要对应调整。

内容的提问来源于stack exchange,提问作者s.dragos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:51:48