須要處理的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同樣多好!!!