android Json详解
Json:一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性。業(yè)內(nèi)主流技術(shù)為其提供了完整的解決方案(有點(diǎn)類似于正則表達(dá)式?,獲得了當(dāng)今大部分語言的支持),從而可以在不同平臺(tái)間進(jìn)行數(shù)據(jù)交換。JSON采用兼容性很高的文本格式,同時(shí)也具備類似于C語言體系的行為。?–?Json.org
官網(wǎng)地址:http://www.json.org/
JSON Vs XML
1.JSON和XML的數(shù)據(jù)可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對(duì)于XML來講,數(shù)據(jù)的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對(duì)數(shù)據(jù)的描述性比XML較差
6.JSON的速度要遠(yuǎn)遠(yuǎn)快于XML
一、JSON語法
?
? JSON 語法規(guī)則
?
- 數(shù)據(jù)在名稱/值對(duì)中
- 數(shù)據(jù)由逗號(hào)分隔
- 花括號(hào)保存對(duì)象
- 方括號(hào)保存數(shù)組
?
JSON 名稱/值對(duì)
? ?JSON 數(shù)據(jù)的書寫格式是:名稱/值對(duì)。
? ?名稱/值對(duì)包括字段名稱(在雙引號(hào)中),后面寫一個(gè)冒號(hào),然后是值:
"firstName" : "John"?JSON 值
? JSON 值可以是:
- 數(shù)字(整數(shù)或浮點(diǎn)數(shù))
- 字符串(在雙引號(hào)中)
- 邏輯值(true 或 false)
- 數(shù)組(在方括號(hào)中)
- 對(duì)象(在花括號(hào)中)
- null
- JSONObject
- JSONArray
JSON 對(duì)象
JSON 對(duì)象在花括號(hào)中書寫:
對(duì)象可以包含多個(gè)名稱/值對(duì):
{ "firstName":"John" , "lastName":"Doe" } 一個(gè){}就是一個(gè)JSONObjectJSON 數(shù)組
JSON 數(shù)組在方括號(hào)中書寫:
數(shù)組可包含多個(gè)對(duì)象:
{ "employees": [ { "firstName":"John" , "lastName":"Doe" }, { "firstName":"Anna" , "lastName":"Smith" }, { "firstName":"Peter" , "lastName":"Jones" } ] }在上面的例子中,對(duì)象 "employees" 是包含三個(gè)對(duì)象的數(shù)組。每個(gè)對(duì)象代表一條關(guān)于某人(有姓和名)的記錄。
二、android提供的json解析類?
android的json解析部分都在包org.json下,主要有以下幾個(gè)類:?
JSONObject:可以看作是一個(gè)json對(duì)象,這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(duì)兒(Key/Value)數(shù)值。它對(duì)外部(External: ? 應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串(例如:{"JSON": "Hello, World"},最外被大括號(hào)包裹,其中的Key和Value被冒號(hào)":"分隔)。其對(duì)于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號(hào)","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認(rèn)值JSONObject.NULLobject 。
JSONStringer:json文本構(gòu)建類 ,根據(jù)官方的解釋,這個(gè)類可以幫助快速和便捷的創(chuàng)建JSON text。其最大的優(yōu)點(diǎn)在于可以減少由于格式的錯(cuò)誤導(dǎo)致程序異常,引用這個(gè)類可以自動(dòng)嚴(yán)格按照J(rèn)SON語法規(guī)則(syntax rules)創(chuàng)建JSON text。每個(gè)JSONStringer實(shí)體只能對(duì)應(yīng)創(chuàng)建一個(gè)JSON text。
JSONArray:它代表一組有序的數(shù)值。將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式是用方括號(hào)包裹,數(shù)值以逗號(hào)”,”分隔(例如: ? ? [value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的了解其格式)。這個(gè)類的內(nèi)部同樣具有查詢行為, ? ? get()和opt()兩種方法都可以通過index索引返回指定的數(shù)值,put()方法用來添加或者替換數(shù)值。同樣這個(gè)類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認(rèn)值JSONObject.NULL object。
JSONTokener:json解析類?
JSONException:json中用到的異常?
1.JSONObject,JSONArray解析,創(chuàng)建Json
示例代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /*? ?????json:{? ?????"languages":[? ?????{"id":1,"ide":"Eclispe","name":"java"},? ?????{"id":2,"ide":"Xcode","name":"Swift"},? ?????{"id":3,"ide":"Visual?Studio","name":"C++"}],? ?????"cat":{"cat":"miao"}? ?????}? */?? ????public?void?creatJson2(){?? ??????????? ????????try?{?? ????????????JSONObject?root?=?new?JSONObject();?? ????????????JSONObject?cat?=?new?JSONObject();?? ????????????cat.put("cat",?"miao");?? ????????????JSONArray?array?=?new?JSONArray();?? ??????????????? ????????????JSONObject?lan1?=?new?JSONObject();?? ????????????lan1.put("id",?1).put("ide",?"Eclispe").put("name",?"java");?? ??????????????? ????????????JSONObject?lan2?=?new?JSONObject();?? ????????????lan2.put("id",?2).put("ide",?"Xcode").put("name",?"Swift");?? ????????????JSONObject?lan3?=?new?JSONObject();?? ????????????lan3.put("id",?3).put("ide",?"Visual?Studio").put("name",?"C++");?? ????????????array.put(lan1);?? ????????????array.put(lan2);?? ????????????array.put(lan3);?? ??????????????? ????????????root.put("languages",?array);?? ????????????root.put("cat",?cat);?? ??????????????? ????????????System.out.println("json:"+root.toString());?? ??????????????? ????????}?catch?(JSONException?e)?{?? ????????????//?TODO?Auto-generated?catch?block?? ????????????e.printStackTrace();?? ????????}?? ????} |
然后是解析的代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public?void?parseJson(){?? ????????try?{?? ????????????InputStreamReader?is?=?new?InputStreamReader(getAssets().open("test2.json"),?"UTF-8");?? ????????????BufferedReader?br?=?new?BufferedReader(is);?? ????????????String?line;?? ????????????StringBuilder?builder?=?new?StringBuilder();?? ????????????while((line=br.readLine())!=null){?? ????????????????builder.append(line);?? ????????????}?? ????????????is.close();br.close();?? ?????????JSONObject?root?=?new?JSONObject(builder.toString());?? ?????????System.out.println("cat:"+root.getString("cat"));?? ?????????JSONArray?array?=?root.getJSONArray("languages");?? ?????????for(int?i=0;i<array.length();i++){?? ?????????????JSONObject?lan?=?array.getJSONObject(i);?? ?????????????System.out.println("..........");?? ?????????????System.out.println("id="+lan.getInt("id"));?? ?????????????System.out.println("ide="+lan.getString("ide"));?? ?????????????System.out.println("name="+lan.getString("name"));?? ?????????}?? ???????????? ????????}?catch?(UnsupportedEncodingException?e)?{?? ????????????//?TODO?Auto-generated?catch?block?? ????????????e.printStackTrace();?? ????????}?catch?(IOException?e)?{?? ????????????//?TODO?Auto-generated?catch?block?? ????????????e.printStackTrace();?? ????????}catch?(JSONException?e)?{?? ????????????//?TODO?Auto-generated?catch?block?? ????????????e.printStackTrace();?? ????????}?? ????} |
?這時(shí)解析的源文件:
| 1 2 3 4 5 6 7 8 | {? ???"languages":[? ???{"id":1,"ide":"Eclipse","name":"java"},? ???{"id":2,"ide":"Xcode","name":"Swift"},? ???{"id":3,"ide":"Visual Studio","name":"C++"}? ???],? ???"cat":"miao"? }? |
2.JSONStringer生成json?
Stringers?only encode well-formed JSON strings. In particular:
- The stringer must have exactly one top-level array or object.
- Lexical scopes must be balanced: every call to?array()?must have a matching call to?endArray()?and every call to?object()?must have a matching call to?endObject(). ?//每次調(diào)用array(),必須匹配endArray,object,endObject同理。
- Arrays may not contain keys (property names).
- Objects must alternate keys (property names) and values.
- Values are inserted with either literal?value?calls, or by nesting arrays or objects.
它定義的所有方法:
它定義的所有方法:| ? | JSONStringer() |
| ? | JSONStringer?array() Begins encoding a new array. |
| ? | JSONStringer?endArray() Ends encoding the current array. |
| ? | JSONStringer?endObject() Ends encoding the current object. |
| ? | JSONStringer?key(String?name) Encodes the key (property name) to this stringer. |
| ? | JSONStringer?object() Begins encoding a new object. |
| ? | String?toString() Returns the encoded JSON string. |
| ? | JSONStringer?value(double value) Encodes?value?to this stringer. |
| ? | JSONStringer?value(Object?value) Encodes?value. |
| ? | JSONStringer?value(long value) Encodes?value?to this stringer. |
| ? | JSONStringer?value(boolean value) Encodes?value?to this stringer. |
?示例代碼:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | /*json:{? ?????????"languages":[? ?????????{"id":1,"ide":"Eclispe","name":"java"},? ?????????{"id":2,"ide":"Xcode","name":"Swift"},? ?????????{"id":3,"ide":"Visual?Studio","name":"C++"}],? ?????????"cat":{"name":"miao"}? ?????????}*/?? ????public?String?createJson(){?? ????????JSONStringer?stringer?=?new?JSONStringer();?? ????????//every?call?to?array()?must?have?a?matching?call?to?endArray()?and?? ????????//every?call?to?object()?must?have?a?matching?call?to?endObject().?? ????????try?{?? ????????????stringer.object();?? ????????????stringer.key("languages");?? ????????????stringer.array();?? ????????????//數(shù)組中的三個(gè)對(duì)象?? ????????????stringer.object();?? ????????????stringer.key("id").value(1).key("ide").value("Eclispe").key("name").value("java");?? ????????????stringer.endObject();?? ??????????????? ????????????stringer.object();?? ????????????stringer.key("id").value(2).key("ide").value("Xcode").key("name").value("Swift");?? ????????????stringer.endObject();?? ??????????????? ????????????stringer.object();?? ????????????stringer.key("id").value(3).key("ide").value("Visual?Studio").key("name").value("C++");?? ????????????stringer.endObject();?? ????????????stringer.endArray();//數(shù)組結(jié)束?? ??????????????? ????????????stringer.key("cat");?? ????????????stringer.object();?? ????????????stringer.key("name").value("miao").endObject();?//結(jié)束object?? ??????????????? ????????????stringer.endObject();?? ??????????????? ????????????System.out.println("json:"+stringer.toString());?? ??????????????? ????????}?catch?(JSONException?e)?{?? ????????????//?TODO?Auto-generated?catch?block?? ????????????e.printStackTrace();?? ????????}?? ????????return?stringer.toString();?? ????} |
? Json數(shù)據(jù)的解析與生成還是很簡單的,可以多去官網(wǎng)看看,多看看文檔。。。android總結(jié)任重道遠(yuǎn)啊,寫博文就是動(dòng)力啊,堅(jiān)持堅(jiān)持。。。。。
另附一篇很好的博文,介紹了很多方法:http://www.open-open.com/lib/view/open1326376799874.html
轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/9708197.html
總結(jié)
以上是生活随笔為你收集整理的android Json详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 82 删除排序链表中的
- 下一篇: 控制台打印列未定义错误