java學習——處理json

須要處理的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格式不肯定,則能夠修改本方法使遞歸提早結束以提升效率;

本例做用:

  1. 在json數據不大的狀況下,能夠直觀的看到值(可是不能格式化顯示)

  2. reRun1的遍歷結果能夠直接存儲到mongodb等數據庫中

  3. 二者皆能夠在遍歷過程當中查找/篩選

吐槽一下,爲毛java這麼強大居然不能直接解析json~~~像人家js同樣多好!!!

相關文章
相關標籤/搜索