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