很少說,直接上代碼: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。