最近遇到包含多层的Json字符串解析的问题,查了一些帖子,不能很好解决。看了下帮助文档,用下面方法解决。
上代码
Maven 库
<!-- https://mvnrepository.com/artifact/org.json/json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180130</version> </dependency>
Java 代码
由于业务需要,下面函数里只需要取到各个层级Json中的key, 放到一个集合中。大家也完全可以取完整的key和value. 根据自己需要,稍作修改即可。下面的关键是while 循环中的两个If 语句,很多帖子都没有把这里写清楚,
第一个 if (jsonObj.optJSONArray(key) instanceof JSONArray) 判断这个key 的value 还是不是一个有多层级的JSONArray.
第二个 if (jsonObj.optJSONObject(key) instanceof JSONObject) 判断这个key 的value 是不是一个只有一层的JSONObject.
public static void jsonObjParseRecur(Set<String> set,String jsonText) { try{ JSONObject jsonObj = new JSONObject(jsonText); Iterator<String> keys=jsonObj.keys(); while(keys.hasNext()){ String key = keys.next(); set.add(key); // System.out.println(key+": " + jsonObj.get(key).toString()); if (jsonObj.optJSONArray(key) instanceof JSONArray) { JSONArray jsonArray = jsonObj.getJSONArray(key); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonArrayObj = jsonArray.getJSONObject(i); String jsonArrayObjString = jsonArrayObj.toString(); jsonObjParseRecur(set,jsonArrayObjString); } } if (jsonObj.optJSONObject(key) instanceof JSONObject) { jsonObjParseRecur(set,jsonObj.optJSONObject(key).toString()); } } } catch (JSONException e) { e.printStackTrace(); } // System.out.println(set); }