觀念:

這篇介紹如何用JSONSting建立JSONObject

以及手動添加key-value到JSONObjet,

opt和get的差別, 取得JSONArray的長度.

 

JSONString是用來方便建立JSON物件的class,

可以利用它方便建立JSON的Text

JSONTokener是用來解析JSON物件的class,

基本上不常用, 因為收到JSON資料的時候

通常都會知道該資料的格式, 沒有必要慢慢解

 

1. 首先到官網http://developer.android.com/reference/org/json/JSONStringer.html

JSONStringer的部分, 可以看一下大概內容

01.png

 

2. 開啟Eclipse, 先宣告一個String 來接收JSONStringer().toString()的物件

02.png

 

3. 接著想要建立的目標貼上, 並且用Enter 排版一下

03.png

 

4. 首先利用 .object(), 和 .endObject()來代表{ 和 }

.object()  //代表 {

.endObject() //代表 }

04.png

 

5. 由於JSON IO會有例外產生, 所以要try catch

05.png

 

6. 接著用.key("字串") 來輸入key值

06.png

 

7. 剛好接下來要放array, 所以利用.array()和.endarray() 代表[ 和 ]

.array() 代表 [

.endArray() 代表 ]

07.png

 

8. 然後用.value(值) 來填入值, 連續的.value()代表連續填值

到這邊是不是覺得這種方式來輸入JSON很直觀

08.png

 

9. 然後整理一下排版
 .key("array").array().value(1).value(2).value(3).endArray()

就代表著key - value 為 "array": [ 1, 2, 3],

09.png

 

10. 下一個是boolean值, 就單純的用.key().value()來給予key和value值

.key("boolean").value(true) 代表"boolean": true

10.png

 

11. 接著是object的object, 就利用之前的經驗, 依序填上key-value

.key("object")

    .object()
            .key("a").value("b")
            .key("c").value("d")
            .key("e").value("f")
    .endObject()

代表著"object": {"a": "b", "c": "d","e": "f"},

11.png

 

12. 最後填入最後一組string的key-value

.key("string").value("Hello World") 代表 "string": "Hello World"

12.png

 

13. 然後用Log把剛剛的字串印出來, 利用DDMS到後台,

就可以看剛剛建立的String是否有建錯

13.png

 

14. 接著宣告一個JSONObject 把剛建立好的String用建構值傳入

14.png

 

15. 這邊順便介紹一下用.opt資料型態去取得value, 

和get不同的是, 當目標key找不到時, 會給預設值

所以不會跳到exception 

15.png

 

16. 利用DDMS到後台就可以看到string1找不到, 所以給予default值

16.png

 

17. 接著介紹如何添加key-value給 JSON物件,

方法就是用.put("key", value)

17.png

 

18. 加完後再到DDMS後台看剛加的是否有成功加入

18.png

 

19. 這方法也可以加入一個Array

19.png

 

20. 加入後再到DDMS下, 就可以看到剛剛的array加入了

20.png

 

21. 接著介紹利用 .length()的方法來取得JSONArray的長度

用法就是 JSONArray.length(), 會回傳int類型的長度

21.png

 

22. 印出Log之後可以到DDMS看結果

22.png

 

23. 最後介紹一下JSONTokener, 你可以想像他是一個字串然後上面有個指標

指著開頭, 隨著你的操作, 該指標會會指項之後的字元

先宣告一個JSONTokener並利用建構值把一開始建立好的Sting放進去

JSONTokener tok = new JSONTokener(jsonObj);

然後利用.next(長度) 的方法, 回傳指標之後目標長度的字元

這邊依序印出之後的5個字元和之後的3個字元

23.png

 

24. 到後台用DDMS就可以看到結果, 要注意的是" "會算在字元內但不會秀在DDMS裡面

24.png

 

25. 因為不常使用的關係, 最後就直接把方法全部列上

可以參考使用如下

   // .next(n)從當下位置取n個字元
   Log.d(TAG, ".next(5) = "+ tok.next(5));
   Log.d(TAG, ".next(3) = "+ tok.next(3));
   // .next() 取出下一個字元
   Log.d(TAG, ".next() = "+ tok.next());
   Log.d(TAG, ".next() = "+ tok.next());
   // .next('字元') 判斷下一個字元是否是該字元, 如果是的話就回傳
   Log.d(TAG, ".next('1') = "+ tok.next('1'));
   // .nextString('字元') 返回下一個遇見該字元之間所有的字串
   Log.d(TAG, ".nextString(':') = "+ tok.nextString(':'));
   // .nextTo('字元') 返回下一個遇見該字元的字串但不包含該字元
   Log.d(TAG, ".nextTo('e') = "+ tok.nextTo('e'));
   // .skipPast("字串") 將當下的指標指到目標字串之後
   tok.skipPast("object");
   Log.d(TAG, ".skipPast(\"object\") next 8 = "+ tok.next(8));
   // .skipTo("字元") 將當下的指標指到目標字元之前
   tok.skipTo('d');
   Log.d(TAG, ".skipTo('d') next 5 = "+ tok.next(5));
   // .back() 將當下的指標返回前一個字元
   tok.back();
   Log.d(TAG, ".back() next 3 = "+ tok.next(3));
   // .nextClean() 秀出下一個字元會自動跳過" "
   Log.d(TAG, ".nextClean() = "+ tok.nextClean());

25.png

 

26. 最後是DDMS的顯示結果

26.png  

arrow
arrow

    RX1226 發表在 痞客邦 留言(0) 人氣()