如何从JSON字符串创建JSONObject的JSONArray?Java中JSONArray为空排查
问题1:如何从JSON字符串创建包含JSONObject的JSONArray?
这是JSON处理里很基础的操作,只要你的字符串是标准的JSON数组格式(以[开头、]结尾,内部是逗号分隔的JSONObject),直接用JSONArray的构造方法就能完成创建。这里默认你使用的是最常用的org.json库(Java生态里广泛使用的JSON处理库),给你一个完整的示例:
// 符合规范的JSON数组字符串,包含两个JSONObject String jsonArrayStr = "[{\"DIMNAME\":\"d11\",\"DIMID\":\"11\"},{\"DIMNAME\":\"d12\",\"DIMID\":\"12\"}]"; try { // 直接通过字符串构造JSONArray JSONArray cadDims = new JSONArray(jsonArrayStr); // 遍历验证内容是否正确 for (int i = 0; i < cadDims.length(); i++) { JSONObject dimObj = cadDims.getJSONObject(i); System.out.println("维度名称:" + dimObj.getString("DIMNAME") + ",ID:" + dimObj.getString("DIMID")); } } catch (JSONException ex) { // 捕获解析异常,比如格式错误时触发 ex.printStackTrace(); }
核心就是确保输入字符串是标准JSON数组格式,没有语法错误,构造方法会自动帮你解析内部的每个JSONObject。
问题2:合法JSON数组字符串生成空JSONArray的排查与解决
你提到jsonlint验证字符串合法,但生成的cadDims始终为空且无异常,结合你给出的两段尝试代码,我帮你梳理几个可能的原因和解决办法:
1. 你可能没正确检查JSONArray的内容
你的尝试代码1其实是完全正确的,会不会只是创建了cadDims但没输出或检查它的长度?比如在创建后加一句System.out.println(cadDims.length());,正常情况下应该输出2,如果输出是0才是真的为空。
2. 字符串存在隐藏的不可见字符
有时候字符串看起来格式正确,但可能带有UTF-8 BOM头(字节顺序标记)或者其他不可见空白字符,jsonlint会忽略这些,但JSONArray构造方法处理时可能会解析异常(或者意外生成空数组)。你可以先清理字符串再解析:
// 去除首尾空白,同时清理可能的BOM头 dataStr = dataStr.trim().replaceAll("^\\uFEFF", ""); JSONArray cadDims = new JSONArray(dataStr);
3. 误用了其他JSON库的JSONArray类
不同的JSON库(比如Gson、Jackson)的JSONArray构造方式完全不同。如果你导入的不是org.json.JSONArray,而是其他库的类,就可能出现解析后为空的情况。检查你的导入语句:
// 确保导入的是org.json包下的类 import org.json.JSONArray; import org.json.JSONObject;
如果是用Gson的话,正确的解析方式应该是:
JsonArray cadDims = new Gson().fromJson(dataStr, JsonArray.class);
4. 尝试代码2的字符串格式错误
你给出的尝试代码2的字符串是{"dataStr":[{"DIM..."},这是一个JSONObject(外层是{}),而不是JSONArray。如果直接用JSONArray构造方法解析这个字符串,理论上应该抛出JSONException,但如果没抛异常可能是字符串不完整。正确的处理方式是先解析成JSONObject,再提取内部的JSONArray:
String dataStr = "{\"dataStr\":[{\"DIMNAME\":\"d11\",\"DIMID\":\"11\"},{\"DIMNAME\":\"d12\",\"DIMID\":\"12\"}]}"; try { JSONObject parentObj = new JSONObject(dataStr); JSONArray cadDims = parentObj.getJSONArray("dataStr"); System.out.println(cadDims.length()); // 正常输出2 } catch (JSONException ex) { ex.printStackTrace(); }
内容的提问来源于stack exchange,提问作者user3217883

