需要处理的json字符串:
{"a":{"a1":"123","b1":"hehe","c1":321},"a2":["a21","a22"],"a3":[{"a31":"a31a31"},{"a32":"a32a32"}]}
第一种:把所有的值按照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();
}
}
}
调用:
new Thread(MyThread()).start()
控制台输出为:
【json】:{"a":{"a1":"123","b1":"hehe","c1":321},"a2":["a21","a22"],"a3":[{"a31":"a31a31"},{"a32":"a32a32"}]}
c1:321
b1:hehe
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一样多好!!!