java学习——处理json

需要处理的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格式不确定,则可以修改本方法使递归提前结束以提高效率;

本例作用:

  1. 在json数据不大的情况下,可以直观的看到值(但是不能格式化显示)

  2. reRun1的遍历结果可以直接存储到mongodb等数据库中

  3. 两者皆可以在遍历过程中查找/筛选

吐槽一下,为毛java这么强大竟然不能直接解析json~~~像人家js一样多好!!!

你可能感兴趣的:(java,json)