2021年1月28日 星期四

JSONObject.putOpt 函式

JSONObject 提供 put() 讓你做寫入

但又提供 putOpt()

基本上同 put(),但較安全

putOpt 函式
將 一組 key-value 寫入 json 物件 (JSONObject)
JSONObject JSONObject.putOpt(String key, Object value)
官方連結
putOpt()  JSONObject 

規則幾乎跟 put() 相同

傳入參數keyname,value
執行動作將 key-val 寫入
回傳值JSONObject物件本身


規則說明
傳入參數狀況 執行結果
keyname 不存在 新增一組 key-value
keyname 已存在 以傳入的 value 取代原有的 value
keyname 已存在
value = null
對應的 key-value 被刪除
keyname = null 沒有任何動作
使用 put 會丟出 Exception


說明範例
程式碼 JSON 內容變化
JSONObject jObj= new JSONObject(); {}
建立了一個空的 JSONObject 物件
jObj.putOpt("K1","Tom"); {"K1":"Tom"}
新增了字串
jObj.putOpt("K2",2); "K1":"Tom","K2":2}
新增了數字
jObj.putOpt("K3",true); {"K1":"Tom","K2":2,"K3":true}
新增了布林值
jObj.putOpt("K1","Jane"));
keyname-"K1" 已存在
{"K1":"Jane","K2":2,"K3":true}
"K1" 的 value 被覆蓋掉
jObj.putOpt("K2",null);
keyname-"K2" 已存在
value 給 null
{"K1":"Jane","K3":true}
"K2" 被移除
jObj.putOpt(null,"xxx");
keyname 給 null
沒有任何動作
使用 put() 會丟出 JSONException : must be non-null


相關文章

如何使用 JSON

如何巡覽 JSONObject 物件內容

如何讀取 JSON 陣列

Jsonobject.put 函式

相關資源

JSONObject 官方文件

JSONObject.putOpt()

JSON 官方文件

2021年1月27日 星期三

JSONObject.put 函式

要操作 JSONObject 的內容, put 是最基本的函式

put 函式
將 一組 key-value 寫入 json 物件 (JSONObject)
系列函式
JSONObject JSONObject.put(String keyname, Object value)
JSONObject JSONObject.put(String keyname, int value)
JSONObject JSONObject.put(String keyname, boolean value)
JSONObject JSONObject.put(String keyname, long value)
JSONObject JSONObject.put(String keyname, double value)
官方連結
put(String, Object )  put(String, int )  put(String, boolean )
put(String, long )  put(String, double )

雖是 Overloading (多形)
各自不同的函式
但規則相同

傳入參數keyname,value
執行動作將 key-val 寫入
回傳值JSONObject物件本身


規則說明
傳入參數狀況 執行結果
keyname 不存在 新增一組 key-value
keyname 已存在 以傳入的 value 取代原有的 value
keyname 已存在
value = null
對應的 key-value 被刪除
keyname = null 丟出 JSONException


說明範例
程式碼 JSON 內容變化
JSONObject jObj= new JSONObject(); {}
建立了一個空的 JSONObject 物件
jObj.put("K1","Tom"); {"K1":"Tom"}
新增了字串
jObj.put("K2",2); "K1":"Tom","K2":2}
新增了數字
jObj.put("K3",true); {"K1":"Tom","K2":2,"K3":true}
新增了布林值
jObj.put("K1","Jane"));
keyname-"K1" 已存在
{"K1":"Jane","K2":2,"K3":true}
"K1" 的 value 被覆蓋掉
jObj.put("K2",null);
keyname-"K2" 已存在
value 給 null
{"K1":"Jane","K3":true}
"K2" 被移除
jObj.put(null,"xxx");
keyname 給 null
丟出 JSONException : must be non-null

使用 put 在 keyname 給 null 時, 會丟出 Exception
在某些 keyname 動態給予的狀況下會出問題
另有較安全的進階版本 JSONObject.putOpt
keyname 給 null 時不會丟出 JSONException
可以參考 putOpt 函式說明

相關文章

如何使用 JSON

如何巡覽 JSONObject 物件內容

如何讀取 JSON 陣列

Jsonobject.putOpt 函式

相關資源

JSONObject 官方文件

JSONObject.put(String, Object )

JSONObject.put(String, int )

JSONObject.put(String, boolean )

JSONObject.put(String, long )

JSONObject.put(String, double )

JSON 官方文件

2021年1月25日 星期一

如何巡覽 JSON 物件內容.使用 Keys 函式

取回 JSONObject 下所有 keyname
有兩個函式可以使用 names() 跟 keys()

JSONArray JSONObject.names()
Iterator<String> JSONObject.keys()

因為兩個函式回傳的資料型態不同
所以後續的處理式也會不同

使用 names() 的方法看這裡

這裡介紹使用keys() 的方法

以 keys() 檢視 JSONObject 所有內容
java.util.Iterator<String> keys= objRoot.keys();
while (keys.hasNext())
{
 String key =keys.next();
 Object val = objRoot.get(key);
 Log(key + "=" +val.tostring());
}
當沒有子元素,不會回傳 null
但,一開始呼叫 hasnext(),就會回傳 false
因此會從 while 直接跳出


keys 函式
Iterator<String> JSONObject.keys()
取回 JSONObject 物件下 keyname
會回傳一個指向 全部 keyname 的 Iterator<String> (迭代器)
keys() 官方說明
Iterator 物件 官方說明

相關文章

如何使用 JSON

如何讀取 JSON 陣列

相關資源

JSONObject 官方文件

keys() 的官方文件

JSONArray 官方文件

Iterator 物件 官方文件

JSON 官方文件

2021年1月19日 星期二

如何讀取 JSON 陣列

內文書籤

範例:取出 JSON 陣列

Length 函式說明

get 函式說明

get 糸列函式 特定資料型別

opt 函式說明

opt 糸列函式 特定資料型別

opt 系列函式 指定 fallback


巡覽 JSON 陣列內容
jstr = ["1",1,true];
jsonAry = new JSONArray(jstr);
try {
 for (int i = 0; i < jsonAry.length(); i++)
 {
  Object obj = jsonAry.get(i);
  log(obj.toString());
 }
}
catch (JSONException ex)
{
 Debug.log(ex);
}
因為失敗時會丟出 JSONException
所以用 try-cath 包起來


用來操作 Json 陣列的物件類別是 JSONArray

JSONArray
org.json.JSONArray
JSONArray 官方文件

要從 JSONObject 中取出陣列物件
要用到 getJSONArray()


要得到 JSONArray 陣列長度,則要用 length

Length 函式
org.json.JSONArray.Length
int length()
跟 ArrayList 不同,不是使用 size()
官方文件

取得陣列中元素是用 get 或 opt

get 函式
取得陣列中的元素
Object get(int index)
傳入 index,該位置的內容以 Object 傳回
如果 index 大於陣列長度,會丟回 JSONException
官方文件


取回 Object 型態有時還需要轉型處理
如果已經確定資料型別
可以直接使用指定回傳資料型別的 get 函式

get 糸列函式 [特定資料型別]
取得 JSONArray 中的特定型別元素
String getString(int index)
int getInt(int index)
boolean getBoolean(int index)
long getLong(int index)
double getDouble(int index)
JSONArray getJSONArray(int index)
JSONObject getJSONObject(int index)
傳入 index,傳回 該位置的內容以特定型別傳回
如果 index 大於陣列長度
或是該位置資型態不符
(像是使用 getInt(),但取得的內容卻不為數字)
會丟回 JSONException
官方文件
getString  getInt  getBoolean  getLong
getDouble  getJSONArray  getJSONObject

在無法確保取回的資料是否安全時,可使用 opt

opt 函式
取回 JSON 陣列中元素
Object opt(int index)
如果 index 大於陣列長度
或資料型態不符
會回傳 null
官方文件

opt 也有指定資料型別的版本

opt 糸列函式 [特定資料型別]
以較安全的方式取回 JSONArray 中元素
Object opt(int index)
booleanoptBoolean(int index)
double optDouble(int index)
int optInt(int index)
JSONArray optJSONArray(int index)
JSONObject optJSONObject(int index)
long optLong(int index)
String optString(int index)
如果 index 大於陣列長度,或資料型態不符
optString 會傳回空字串
optInt 會傳回 0
optBoolean 會傳回 false
optLong 會傳回 0
optDouble 會傳回 NaN
opt 會傳回 null
optJSONArray 會傳回 null
optJSONObject 會傳回 null
官方文件
optString  optInt  optBoolean  optLong
optDouble  optJSONArray  optJSONObject

opt 可以指定失敗時回傳預設內容的版本

opt 系列函式 + fallback
取回 JSONArray 中的元素,取值失敗時傳回指定的 fallback
String optString(int index , String fallback)
int optInt(int index , int fallback)
booleanoptBoolean(int index , boolean fallback)
double optDouble(int index , double fallback)
long optLong(int index , boolean fallback)
傳回 index 及失敗時回傳值,傳回該位置的內容
取值失敗
(ex: index 大於陣列長度,取回的值資料型態不符)
會傳回參數指定的 fallback
官方文件
optString  optInt  optBoolean  optLong
optDouble 


相關文章

如何使用 JSON

如何巡覽 JSONObject 物件內容

相關資源

JSONObject 官方文件

JSONArray 官方文件

Iterator 官方文件(Android Developers)

JSON 官方文件