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同样多好!!!

相关文章
相关标签/搜索