Java解析JSON文件:getJSONObject(int)未定义及字段取值问题
解决JSONArray.getJSONObject未定义及获取嵌套字段值的问题
看起来你遇到的问题主要是因为使用的JSON库(应该是org.json.simple)的API和你预期的不一样,再加上原始代码里做了没必要的包装操作,导致取字段时卡壳了。咱们一步步来解决:
问题根源分析
- 不必要的数组包装:你的JSON文件内容本身是单个JSON对象(
{"flowrate":...,"command":...}),但你解析后把它放进了一个新的JSONArray里,这其实是多此一举的操作。 - 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
相关产品推荐
相关产品推荐

