2020年12月21日 星期一

如何巡覽 JSON 物件內容

有需要的可以先參考 如何使用 JSON

想要取出所有的子元素
要先取回全部 keyname
再以 keyname 取得 value

取回 keyname 有兩個函式可用:names() 跟 keys()

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

因為兩個函式回傳的資料型態不同
所以後續的處理式也會不同
這裡先示範使用 names() 的方法

以 names() 檢視 JSONObject 所有內容
JSONArray keys= objRoot.names();
//防止因為沒有內容物接到 null
if (keys== null)
{
 Log("keys== null")
 return;
}

//依序以 keyname 取出 value
for (int i = 0; i < keys.length(); ++i)
{
 String key =keys.getString(i);
 Object val = objRoot.get(key);
 Log(key + "=" +val.tostring());
}


name 函式
取回 JSONObject 物件下所有 keyname
org.json.JSONObject.name()
JSONArray names()
傳回一個有所有 keyname 的 JSONArray
如果 沒有子物件,傳回 null
name() 的官方文件
JSONArray 官方文件

以 Keys 函式巡覽 JSON 物件內容


相關文章

如何使用 JSON

如何讀取 JSON 陣列

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

相關資源

JSONObject 官方文件

JSONArray 官方文件

Iterator 物件 官方文件

JSON 官方文件

2020年12月12日 星期六

如何使用 json

要操作 JSON,需要使用 JSONObject 物件

JSONObject
org.json.JSONObject
用來操作 JSON 物件的類別
JSONObject官方文件


get 系列函式
以 keyname 從 JSONObject 取出對應 value
org.json.JSONObject.get
Object get(String keyname)
String getString(String keyname)
int getInt(String keyname)
boolean getBoolean(String keyname)
long getLong(String keyname)
double getDouble(String keyname)
JSONArray getJSONArray(String keyname)
JSONObject JSONObject.getJSONObject(String keyname)
傳入 keyname,回傳 value
當 keyname不存在時,會丟出 JSONException


單純的取用 json 內容
JSON 內容
{
 "Title":"His Dark Materials",
 "Number":3,
 "Fun":true,
 "Empty":null
}
try {
 JSONObject objRoot = new JSONObject(jsonString);
 //從字串建立 JSONObject

 objRoot.get("Title")
 //得到 Object , 內容為 "His Dark Materials" (String)

 objRoot.getString("Title")
 //得到 String, 內容為 "His Dark Materials"

 objRoot.getInt("Number")
 //得到 int , 內容為 3

 objRoot.getBoolean("Fun")
 //得到 boolean, 內容為 true

 objRoot.get("Empty")
 //得到 null

 objRoot.get("Nokey")
 //會丟出 Exception: "No Value for Nokey"
}catch (JSONException ex) {
 Debug.log(ex);
}
會在錯誤時丟出 JSONException,所以要用 try-catch 包起來


以 get() 取值,
再以 instanceof 判斷資料型別後各別處理
Object val = objRoot.get(who);

if (val.equals(null))
{
 log(key + " is null");
}
else if (val instanceof String)
{
 log(key + "=" + (String) val );
}
else if (val instanceof Integer)
{
 log(key + "=" + ((Integer) val).toString() );
}
else if (val instanceof Boolean)
{
 log(key + "=" + ((Boolean) val).toString() );
}
else if (val instanceof JSONObject)
{
 log(key + " is JSONObject");
}
else if (val instanceof JSONArray) {
 log(key + " is JSONArray");
}

當 key 不存在,使用get會丟出 exception
可改用 opt() 避免之


opt 系列函式
以 keyname 從 JSONObject 取出對應 value
但,不會 在keyname 不存在時丟出 JSONException
org.json.JSONObject.opt
Object opt (String keyname)
String optString (String keyname)
int optInt (String keyname)
boolean optBoolean (String keyname)
double optDouble (String keyname)
JSONArray optJSONArray (String keyname)
JSONObject optJSONObject (String keyname)
傳入 keyname,回傳 value
當 keyname 不存在
optString 會傳回空字串
optInt 會傳回 0
optBoolean 會傳回 false
optLong 會傳回 0
optDouble 會傳回 NaN
opt 會傳回 null
optJSONArray 會傳回 null
optJSONObject 會傳回 null


opt 系列函式 + fallback
以 keyname 從 JSONObject 取出對應 value
當取 value 失敗時,回傳設定好的 fallback
String optString (String keyname, String fallback)
boolean optBoolean (String keyname, boolean fallback)
double optDouble (String keyname, double fallback)
int optInt (String keyname, int fallback)
long optLong (String keyname, long fallback)
傳入 keyname,以及 keyname 不在時的回傳值- fallback
當 key 存在,會回傳value
當 key 不存在,則會傳回 設定的 fallback 


opt 使用範例
JSON 內容
{
"Title":"His Dark Materials",
"Number":3,
"Fun":true
}
objRoot.opt("Title")
//得到 "His Dark Materials" (String)

objRoot.opt("Nokey")
//用 opt 讀取一個不存在的 key 值,將會得到 null

objRoot.optSting("Nokey","Nothing")
//用 optSting() 讀取一個不存在的 key 值
//並設定 key值不存在時傳回 "Nothing"
//將會得到 "Nothing"

為了防止 key 不存在,也可以先確認 key 是否存在

has 函式
檢查 keyname 是否存在
org.json.JSONObject.has
boolean has(String keyname)
傳入 keyname, 回傳 keyname 是存在否


用 has() 防止key值不存在
if ( ! objRoot.has("Nokey"))
{
 Debug.log("Nokey 不存在");
}
else
{
 val = objRoot.get("Nokey");
 Debug.log("get(Nokey) =" + val.toString());
}


相關文章

如何巡覽 JSON 物件內容

如何巡覽 JSON 陣列內容


相關資源

JSONObject 官方文件

JSONArray 官方文件

JSON 官方文件