日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android Json详解

發(fā)布時(shí)間:2024/4/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android Json详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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è)JSONObject

JSON 數(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.

它定義的所有方法:

它定義的所有方法:
Public Constructors
?JSONStringer()
Public Methods
?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.
它的方法不多,很精簡,所以說用Stringer創(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 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。