[英]How can I parse Nested JSON with dynamic keys in Android kotlin, Moshi and Retrofit?
如何解析嵌套的 JSON 與 Android kotlin、Moshi 和 ZB979040596D696A27D696A278 中的NESTED動態鍵?
我從alpha-vantage得到這個 JSON 。
格式示例:
{
"Meta Data": {
"1. Information": "Intraday (15min) open, high, low, close prices and volume",
"2. Symbol": "AAME",
"3. Last Refreshed": "2019-11-18 16:00:00",
"4. Interval": "15min",
"5. Output Size": "Compact",
"6. Time Zone": "US/Eastern"
},
"Time Series (15min)": {//Dynamic - > Time Series (5min) / Time Series (30min)
"2019-11-18 16:00:00": {//Dynamic
"1. open": "1.6700",
"2. high": "1.6700",
"3. low": "1.5700",
"4. close": "1.5700",
"5. volume": "1521"
},
"2019-11-18 15:45:00": {//Dynamic
"1. open": "1.6600",
"2. high": "1.7400",
"3. low": "1.6600",
"4. close": "1.7400",
"5. volume": "355"
}
}
}
我嘗試使用自定義適配器,但找不到用它解析雙嵌套動態鍵的方法。 現在我使用手動解析:
fun convertJsonToItemDetails(jso: JSONObject) {
val meta: JSONObject? = jso.optJSONObject("Meta Data")
var metaData: ItemMetaData? = null
meta?.apply {
val information = optString("1. Information")
val symbol = optString("2. Symbol")
val lastRefreshed = optString("3. Last Refreshed")
val interval = optString("4. Interval")
val outputSize = optString("5. Output Size")
val timeZone = optString("6. Time Zone")
metaData =
ItemMetaData(information, symbol, lastRefreshed, interval, outputSize, timeZone)
}
if (metaData == null) {
//TODO return error object
return
}
val timeSeriesJSON = jso.optJSONObject("Time Series (${metaData?.interval})")
val timeSeires = HashMap<String, IntervalOutput>()
if (timeSeriesJSON == null) {
//TODO return error object
return
}
for (key in timeSeriesJSON.keys()) {
val intervalOutPutJSON = timeSeriesJSON.getJSONObject(key)
val open = intervalOutPutJSON.getString("1. open")
val high = intervalOutPutJSON.getString("2. high")
val low = intervalOutPutJSON.getString("3. low")
val close = intervalOutPutJSON.getString("4. close")
val volume = intervalOutPutJSON.getString("5. volume")
timeSeires[key] = IntervalOutput(open, high, low, close, volume)
}
val itemDetails = ItemDetails(metaData, timeSeires)
_itemDetails.value = itemDetails
}
使用JSONObject keys()獲取Dynamic Keys
,然后Iterate
每個特定鍵以獲取動態值。
打印所有 1st Tier 的JSONObject
非常簡短,如下所示。
var dynamicJSON: String = {
"Meta Data": {
"1. Information": "Intraday (15min) open, high, low, close prices and volume",
"2. Symbol": "AAME",
"3. Last Refreshed": "2019-11-18 16:00:00",
"4. Interval": "15min",
"5. Output Size": "Compact",
"6. Time Zone": "US/Eastern"
},
"Time Series (15min)": {//Dynamic - > Time Series (5min) / Time Series (30min)
"2019-11-18 16:00:00": {//Dynamic
"1. open": "1.6700",
"2. high": "1.6700",
"3. low": "1.5700",
"4. close": "1.5700",
"5. volume": "1521"
},
"2019-11-18 15:45:00": {//Dynamic
"1. open": "1.6600",
"2. high": "1.7400",
"3. low": "1.6600",
"4. close": "1.7400",
"5. volume": "355"
}
}
}
然后在您必須開始將其解析為 JSONObject 之后,然后進一步對 JSONObject "Meta Data"
和"Time Series (15min)"
執行相同的過程
val dynamicjson: JSONObject = JSONObject(dynamicJSON)
val keys: Iterator<*> = dynamicjson.keys()
while (keys.hasNext()) { // loop to get the dynamic key
val currentDynamicKey = keys.next() as String
// get the value of the dynamic key
val currentDynamicValue: JSONObject = dynamicjson.getJSONObject(currentDynamicKey)
// do something here with the value... or either make another while loop to Iterate further
Log.e("JSON Value", currentDynamicValue.toString())
}
當我執行代碼時,OUTPUT 看起來像這樣:
2019-12-12 15:21:08.399 19798-19798/com.animusabhi.dynamicjsonparsing E/JSON 值:{“1.信息”:“盤中(15分鍾)開盤價、最高價、最低價、收盤價和成交量”,“2 . Symbol":"AAME","3. Last Refreshed":"2019-11-18 16:00:00","4. Interval":"15min","5. Output Size":"Compact"," 6. 時區":"美國/東部"}
2019-12-12 15:21:09.158 19798-19798/com.animusabhi.dynamicjsonparsing E/ JSON 值{"2019-11-18 16:00:00":{"1. open":"1.6700","2 .high":"1.6700","3.low":"1.5700","4.close":"1.5700","5.volume":"1521"},"2019-11-18 15:45:00 ":{"1.開盤":"1.6600","2.高":"1.7400","3.低":"1.6600","4.收盤":"1.7400","5.成交量":" 355"}}
檢查並讓我知道它是否不起作用。
只需將您的 json 字符串傳遞給此方法,它肯定會起作用。
private void parseJson(String jsonString) {
try {
// pass your response json string here
JSONObject object = new JSONObject(jsonString);
Iterator<String> it = object.keys();
while (it.hasNext()) {
String key = it.next();
try {
if (object.get(key) instanceof JSONObject) {
Log.e("Main OBJ", key);
JSONObject object2 = object.getJSONObject(key);
Iterator<String> it2 = object2.keys();
while (it2.hasNext()) {
String key2 = it2.next();
if (object2.get(key2) instanceof JSONObject) {
Log.e("Sub OBJ", key2);
JSONObject object3 = object2.getJSONObject(key2);
Iterator<String> it3 = object3.keys();
while (it3.hasNext()) {
String key4 = it3.next();
Log.e("Values", key4);
}
} else {
Log.e("Values", object2.getString(key2));
}
}
} else {
System.out.println(key + ":" + object.getString(key));
}
} catch (Throwable e) {
try {
System.out.println(key + ":" + object.getString(key));
} catch (Exception ee) {
ee.printStackTrace();
}
e.printStackTrace();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
Output:
Main OBJ: Meta Data
Values: Intraday (15min) open, high, low, close prices and volume
Values: AAME
Values: 2019-11-18 16:00:00
Values: 15min
Values: Compact
Values: US/Eastern
Main OBJ: Time Series (15min)
Sub OBJ: 2019-11-18 16:00:00
Values: 1. open
Values: 2. high
Values: 3. low
Values: 4. close
Values: 5. volume
Sub OBJ: 2019-11-18 15:45:00
Values: 1. open
Values: 2. high
Values: 3. low
Values: 4. close
Values: 5. volume
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.