java学习——处理json

很少说,直接上代码:java

/**
 * Created by xxx on 15/7/30.
 */
public class JsonFormatTool {
    /**
     * 单位缩进字符串。
     */
    private static String SPACE = "   ";

    /**
     * 返回格式化JSON字符串。
     *
     * @param json 未格式化的JSON字符串。
     * @return 格式化的JSON字符串。
     */
    public String formatJson(String json)
    {
        StringBuffer result = new StringBuffer();

        int length = json.length();
        int number = 0;
        char key = 0;

        //遍历输入字符串。
        for (int i = 0; i < length; i++)
        {
            //一、获取当前字符。
            key = json.charAt(i);

            //二、若是当前字符是前方括号、前花括号作以下处理:
            if((key == '[') || (key == '{') )
            {
                //(1)若是前面还有字符,而且字符为“:”,打印:换行和缩进字符字符串。
                if((i - 1 > 0) && (json.charAt(i - 1) == ':'))
                {
                    result.append('\n');
                    result.append(indent(number));
                }

                //(2)打印:当前字符。
                result.append(key);

                //(3)前方括号、前花括号,的后面必须换行。打印:换行。
                result.append('\n');

                //(4)每出现一次前方括号、前花括号;缩进次数增长一次。打印:新行缩进。
                number++;
                result.append(indent(number));

                //(5)进行下一次循环。
                continue;
            }

            //三、若是当前字符是后方括号、后花括号作以下处理:
            if((key == ']') || (key == '}') )
            {
                //(1)后方括号、后花括号,的前面必须换行。打印:换行。
                result.append('\n');

                //(2)每出现一次后方括号、后花括号;缩进次数减小一次。打印:缩进。
                number--;
                result.append(indent(number));

                //(3)打印:当前字符。
                result.append(key);
                
                //(4)若是当前字符后面还有字符,而且字符不为“,”,打印:换行。
                if(((i + 1) < length) && (json.charAt(i + 1) != ',') && (json.charAt(i + 1) != ']') && (json.charAt(i + 1) != '}'))
                {
                    result.append('\n');
                }

                //(5)继续下一次循环。
                continue;
            }

            //四、若是当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
            if((key == ',') && (json.charAt(i + 1) == '"'))
            {
                result.append(key);
                result.append('\n');
                result.append(indent(number));
                continue;
            }

            //五、打印:当前字符。
            result.append(key);
        }

        return result.toString();
    }

    /**
     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
     *
     * @param number 缩进次数。
     * @return 指定缩进次数的字符串。
     */
    private String indent(int number)
    {
        StringBuffer result = new StringBuffer();
        for(int i = 0; i < number; i++)
        {
            result.append(SPACE);
        }
        return result.toString();
    }
}

代码解释:都是基本的java语法,根据不一样的字符分隔字符串,而后进行缩进,最后return缩进好的字符串,都看得懂。然而,在实际项目中,并非要输出,而是要获取值进行比较或者进行其余操做,那么怎么获取值呢。。。(别天真的觉得还自个用字符串分割~~~)json

问度娘,你会知道两个jar能够解析json:orj.json(推荐)和json.simple1.1数组

确实,这两个均可以解析jsonapp

二者解析json字符串的方式大同小异,可是效率org.json的相对高点spa

//org.json的方式
//先把json字符串变成JSONObject
String s = "{\"a\":{\"a1\":\"123\",\"b1\":\"hehe\",\"c1\":321},\"a2\":[\"a21\",\"a22\"],\"a3\":[{\"a31\":\"a31a31\"},{\"a32\":\"a32a32\"}]}";
JSONObject obj = new JSONObject(s);
//而后就能够用迭代器选好遍历了...
//遇到数组就用JSONArray valArray = new JSONArray(val);接着就能够用get(int i)来取数组里值。

//simple.json的方式
//基本和org.json初始化一致,其可以使用的方法也基本一致。可是,初始化多了一种方法:
Object obj = JSONValue.parse(s);
//而后能够进行强制转换或者实例化JSONObjct或者JSONArray进行操做

总结:java处理json字符串,不管是org.json仍是simple.json,无非两种方法:code

    一、假如是:{},就用JSONObjcet来装,用get(String s)来取值,用迭代器来遍历。
orm

    二、假如是:[],就用JSONArray来装,用get(int n)来取值,用for来遍历。
字符串

想一想彷佛没其余状况了哈~~~嘿嘿,其实到这基本够用了,可是我想到一个不常见的问题:get

假如是一个未知格式的json字符串,要取其中key=“myId”的值,怎么弄呢?form

这个未知的json字符串多是这样的:{“myId”:“hehe”}

也多是这样的:{[“myId”:“hehe”]}

也多是这样的:{“myId”:[“hehe”]}

也多是这样的:{“no1”:[{“myId”:“hehe”}]}

那么,问题来了,既然格式未定,遍历是确定的,遍历的到那个key,怎么取值就成问题了,由于这个key对应的值多是String、JSONObject、JSONArray。so...解决方案...自个想去!!!

个人解决方案是:丫的,跟数据提供方协商好json格式,假如取不到值就抛异常,进行异常处理。假如是本身写爬虫爬别人的数据时出现这种状况,我只能呵呵,乖乖作三次try/catch。

相关文章
相关标签/搜索