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。

相關文章
相關標籤/搜索