须要处理的json字符串:java
{"a":{"a1":"123","b1":"hehe","c1":321},"a2":["a21","a22"],"a3":[{"a31":"a31a31"},{"a32":"a32a32"}]}mongodb
第一种:把全部的值按照key:value的格式打印到控制台(呵呵,固然你也能够作筛选等处理)数据库
package com.test.main; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.Iterator; import java.util.regex.Pattern; /** * 处理json字符串,在控制台打印出全部的key:value * */ public class MyThread implements Runnable { public MyThread() {} @Override public void run() { String s = "{\"a\":{\"a1\":\"123\",\"b1\":\"hehe\",\"c1\":321},\"a2\":[\"a21\",\"a22\"],\"a3\":[{\"a31\":\"a31a31\"},{\"a32\":\"a32a32\"}]}"; System.out.println("【json】:"+s); reRun1(s); System.out.println(); reRun2(s); } //控制台打印出json数据的key:value,value为数组原样输出 public void reRun1(String s) { try { JSONObject obj = new JSONObject(s); Iterator i = obj.keys(); while (i.hasNext()){ //得到迭代器 String iIterator = i.next().toString(); //得到迭代器对应的值 String val = obj.get(iIterator).toString(); if (Pattern.compile("^\\[\\{").matcher(val).find()) { JSONArray valArray = new JSONArray(val); for (int j = 0; j < valArray.length(); j++) { //数组的值是对象(或者说json),则递归 reRun1(valArray.get(j).toString()); } }else { if (Pattern.compile("^\\{").matcher(val).find()) { //value是对象(或者说json),则递归 reRun1(val); } else { System.out.println(iIterator+":"+val); } } } } catch (JSONException e) { e.printStackTrace(); } } //控制台打印出json数据的key:value,value为数组则遍历 public void reRun2(String s) { try { JSONObject obj = new JSONObject(s); Iterator i = obj.keys(); while (i.hasNext()){ //得到迭代器 String iIterator = i.next().toString(); //得到迭代器对应的值 String val = obj.get(iIterator).toString(); if (Pattern.compile("^\\[").matcher(val).find()) { JSONArray valArray = new JSONArray(val); for (int j = 0; j < valArray.length(); j++) { if (Pattern.compile("^\\{").matcher(valArray.get(j).toString()).find()) { //数组的值是对象(或者说json),则递归 reRun2(valArray.get(j).toString()); }else { //数组的值不是对象,则直接输出 System.out.println(iIterator+"["+j+"]:"+valArray.get(j)); } } }else { if (Pattern.compile("^\\{").matcher(val).find()) { //value是对象(或者说json),则递归 reRun2(val); } else { System.out.println(iIterator+":"+val); } } } } catch (JSONException e) { e.printStackTrace(); } } }
调用:json
new Thread(MyThread()).start()
控制台输出为:数组
【json】:{"a":{"a1":"123","b1":"hehe","c1":321},"a2":["a21","a22"],"a3":[{"a31":"a31a31"},{"a32":"a32a32"}]}ide
c1:321spa
b1:hehecode
a1:123对象
a2:["a21","a22"]递归
a31:a31a31
a32:a32a32
c1:321
b1:hehe
a1:123
a2[0]:a21
a2[1]:a22
a31:a31a31
a32:a32a32
此方法用到了较多的循环和递归,效率不高,在实际应用中,假如json格式固定的话直接用JSONObject一步一步取到具体的位置便可;假如json格式不肯定,则能够修改本方法使递归提早结束以提升效率;
本例做用:
在json数据不大的状况下,能够直观的看到值(可是不能格式化显示)
reRun1的遍历结果能够直接存储到mongodb等数据库中
二者皆能够在遍历过程当中查找/筛选
吐槽一下,为毛java这么强大居然不能直接解析json~~~像人家js同样多好!!!