【发布时间】:2019-11-19 14:50:37
【问题描述】:
如何在 Android kotlin、Moshi 和 Retrofit 中使用 NESTED 动态键解析嵌套 JSON?
我从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
}
【问题讨论】:
-
由于 JSON 是当今数据交换的新标准,难道没有可用的 JSON 解析库吗?
-
是的,你是对的 JSON 是新标准,但我没有找到用 Moshi 解析这个用例的方法。@Mikkel
-
android kotlin 是否有“for-each”类型的组件?伪代码:对 JSONObject JO 中的每个键 k 做 X
-
我不想手动解析它(我现在做了什么),我想用 Moshi 来做。
-
我花了一些时间试图为您提出一个解决方案,但是您的 JSON 在键名中包含空格,最终破坏了 Moshi 的 Kotlin Codegen。我已经为此提交了一个问题 (github.com/square/moshi/issues/1052) 并决定暂时离开这个问题,因为我没有时间给你写一个适配器工厂。
标签: android kotlin retrofit2 kotlin-android-extensions moshi