本文共 6208 字,大约阅读时间需要 20 分钟。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
基础结构
基础示例
JSON 表示"名称 / 值对"
{ "firstName": "Brett"}
多个"名称 / 值对"串在一起时:
// 假设现在要创建这样一个json文本 // { // "phone" : ["12345678", "87654321"], // 数组 // "name" : "yuanzhifei89", // 字符串 // "age" : 100, // 数值 // "address" : { "country" : "china", "province" : "jiangsu" }, // 对象 // "married" : false // 布尔值 // } try { JSONObject person = new JSONObject(); JSONArray phone = new JSONArray(); phone.put("12345678").put("87654321");//put函数返回自己本身 person.put("phone", phone); person.put("age",100 ); JSONObject address = new JSONObject(); address.put("country", "china"); address.put("province", "jiangsu"); person.put("address", address); person.put("married", false); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }2。getType和optType api的使用
getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值
try { // 所有使用的对象都是用上面创建的对象 // 将第一个电话号码转换为数值和将名字转换为数值 phone.getLong(0); person.getLong("name"); // 会抛异常,因为名字无法转换为long phone.optLong(0); // 代码内置的默认值 phone.optLong(0, 1000); // 用户提供的默认值 person.optLong("name"); person.optLong("name", 1000); // 不像上面那样抛异常,而是返回1000 } catch (JSONException ex) { // 异常处理代码 }3。使用JSONStringer来构建json文本
//JSONStringer的使用 // { // "phone" : ["12345678", "87654321"], // 数组 // "name" : "yuanzhifei89", // 字符串 // "age" : 100, // 数值 // "address" : { "country" : "china", "province" : "jiangsu" }, // 对象 // "married" : false // 布尔值 // } JSONStringer jsonString = new JSONStringer(); try { jsonString.object();//构建一个对象 jsonString.key("phone");jsonString.array();//注意array和endArray相对应 jsonString.value("12345678").value("87654321"); jsonString.endArray(); jsonString.key("name"); jsonString.value("yuanzhifei89"); jsonString.key("age"); jsonString.value(100); jsonString.key("address");//address 的值为对象 jsonString.object(); jsonString.key("country"); jsonString.value("China");jsonString.key("province"); jsonString.value("jiangsu"); jsonString.endObject(); jsonString.key("married"); jsonString.value(false); jsonString.endObject();} catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }4。json文本解析类JSONTokener
private String JSON = "{" + " \"phone\" : [\"12345678\", \"87654321\"]," + " \"name\" : \"yuanzhifei89\"," + " \"age\" : 100," + " \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," + " \"married\" : false" + "}"; try { JSONTokener jsonParser = new JSONTokener(JSON); // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。 // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String) JSONObject person = (JSONObject) jsonParser.nextValue(); // 接下来的就是JSON对象的操作了 person.getJSONArray("phone"); person.getString("name"); person.getInt("age"); person.getJSONObject("address"); person.getBoolean("married"); } catch (JSONException ex) { // 异常处理代码 }5。其它的api基本就是用来查看json文本中的文本的
JSONTokener jsonToken = new JSONTokener(JSON); try { String next8 = jsonToken.next(8);//{ "phon char next1 = jsonToken.next();//e char next1Clean = jsonToken.nextClean();//读取下一个不是空白和注释中的字符 这里返回 " String nextAString = jsonToken.nextString('a');// : ["12345678", "87654321"], "n 取得从当前位置到第一次遇到'a'之间的字符串(不包括a) //返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了8) // me" : "yuanzhifei String nextTo0089 = jsonToken.nextTo("008");//此时读取位置在i jsonToken.back(); char backThenNext = jsonToken.next();//i jsonToken.skipPast("address");//读取位置前进到指定字符处,包括指定字符串 String skipNext = jsonToken.next(8);//" : { "c jsonToken.skipTo('m');//读取位置前进到执行字符处(不包括字符) String skipToNext = jsonToken.next(8);//married" } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }
转载地址:http://lfyub.baihongyu.com/