觀念:
這篇介紹如何用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的部分, 可以看一下大概內容
2. 開啟Eclipse, 先宣告一個String 來接收JSONStringer().toString()的物件
3. 接著想要建立的目標貼上, 並且用Enter 排版一下
4. 首先利用 .object(), 和 .endObject()來代表{ 和 }
.object() //代表 {
.endObject() //代表 }
5. 由於JSON IO會有例外產生, 所以要try catch
6. 接著用.key("字串") 來輸入key值
7. 剛好接下來要放array, 所以利用.array()和.endarray() 代表[ 和 ]
.array() 代表 [
.endArray() 代表 ]
8. 然後用.value(值) 來填入值, 連續的.value()代表連續填值
到這邊是不是覺得這種方式來輸入JSON很直觀
9. 然後整理一下排版
.key("array").array().value(1).value(2).value(3).endArray()
就代表著key - value 為 "array": [ 1, 2, 3],
10. 下一個是boolean值, 就單純的用.key().value()來給予key和value值
.key("boolean").value(true) 代表"boolean": true
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"},
12. 最後填入最後一組string的key-value
.key("string").value("Hello World") 代表 "string": "Hello World"
13. 然後用Log把剛剛的字串印出來, 利用DDMS到後台,
就可以看剛剛建立的String是否有建錯
14. 接著宣告一個JSONObject 把剛建立好的String用建構值傳入
15. 這邊順便介紹一下用.opt資料型態去取得value,
和get不同的是, 當目標key找不到時, 會給預設值
所以不會跳到exception
16. 利用DDMS到後台就可以看到string1找不到, 所以給予default值
17. 接著介紹如何添加key-value給 JSON物件,
方法就是用.put("key", value)
18. 加完後再到DDMS後台看剛加的是否有成功加入
19. 這方法也可以加入一個Array
20. 加入後再到DDMS下, 就可以看到剛剛的array加入了
21. 接著介紹利用 .length()的方法來取得JSONArray的長度
用法就是 JSONArray.length(), 會回傳int類型的長度
22. 印出Log之後可以到DDMS看結果
23. 最後介紹一下JSONTokener, 你可以想像他是一個字串然後上面有個指標
指著開頭, 隨著你的操作, 該指標會會指項之後的字元
先宣告一個JSONTokener並利用建構值把一開始建立好的Sting放進去
JSONTokener tok = new JSONTokener(jsonObj);
然後利用.next(長度) 的方法, 回傳指標之後目標長度的字元
這邊依序印出之後的5個字元和之後的3個字元
24. 到後台用DDMS就可以看到結果, 要注意的是" "會算在字元內但不會秀在DDMS裡面
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());
26. 最後是DDMS的顯示結果
留言列表