如何在Android kotlin、Moshi和Regetfit中解析嵌套动态键的嵌套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
}
使用JSONObject keys()获取动态键
,然后迭代
每个特定键以获取动态值。
打印第一层的所有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“元数据”
&“时间序列(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())
}
当我执行代码时,输出如下所示:
2019-12-12 15:21:08.399 197 98-19798/com.animusabhi.DynamicJSON解析E/JSON ;值:{“1.信息”:“盘中(15分钟)开盘、高点、低点、收盘价和成交量”,“2.符号”:“AAME”,“3.最后刷新”:“2019-11-18 16:00:00”,“4.间隔”:“15分钟”,“5.输出大小”:“紧凑”,“6.时区”:“美国/东部”}
2019-12-12 15:21:09.158 197 98-19798/com.animusabhi.DynamicJSONParsing E/JSON ;值{“2019-11-18 16:00:00”:{“1.打开”:“1.6700”,“2.高”:“1.6700”,“3.低”:“1.5700”,“4.关闭”:“1.5700”,“5.卷”:“1521”},“2019-11-18 15:45:00”:{“1.打开”:“1.6600”,“2.高”:“1.7400”,“3.低”:“1.6600”,“4.关闭”:“1.7400”,“5.卷”:“355”“}}
检查并让我知道如果它不工作。
问题内容: 有以下格式的JSON结果,JSON Lint将其显示为“有效响应”。 我的问题是:由于“ 141”,“ 8911”等都是动态值,我如何访问“ question_mark”的内容? 我的示例代码用于访问“产品”的价值。 我的问题标题“动态键”可能是错误的,但目前我不知道该问题的最佳名称是什么。 任何帮助将不胜感激! 问题答案: 使用JSONObject keys()获取密钥,然后迭代每个
我有一个独特的情况,我必须从JSON的深度嵌套对象中获得某些时间。这有点复杂,我找不到一个解决方案,所以寻找解决这个问题的想法和方法 是否有一种方法可以在这个级别检索started_at,并以8:00 am的格式解析日期和时间?在我的代码中使用它。 你知道怎么做吗?谢了!请让我知道,如果这是混淆或需要更多的澄清,很高兴张贴更多的代码。
问题内容: 我有以下格式的JSON结果,JSON Lint将其显示为“有效响应”。 我的问题是:由于“ 141”,“ 8911”等都是动态值,我如何访问“ question_mark”的内容? 我的示例代码用于访问“产品”的价值。 JSON: 我的问题标题“动态键”可能是错误的,但目前我不知道该问题的最佳名称是什么。 任何帮助将不胜感激! 问题答案: 使用JSONObject keys() 获取密
在我的Android应用程序中,我使用referfit来描述内部API:
问题内容: 我目前正在开发一个Android项目,该项目需要我调用网络服务,该服务将返回一个json文件。我一直在使用GSON库来解析所有json文件并获取一个JSON对象。在我遇到关键字段是动态的json数据之前,它一直运行良好。此文件的示例如下: 我能够基于键ID“ 0”获得计数,但是我不确定如何利用该值来获取其他键对象(键ID 1-5),该键对象包含以下数据:我需要。如果有人在这件事上能帮助
问题内容: 我正在尝试使用Go解析YAML文件。问题在于YAML文件中的密钥可能并不总是相同。这是为了进行API版本控制,以便用户可以定义他们支持的版本。例如V1,V2,V3等。它们不需要按顺序排列,并且可以省略它们不支持的版本,例如V0,V2,V5等。 这是最高层,我还没有从结构内部弄清楚如何做到这一点。 问题答案: 首先,您尝试将根解析为,但其实际类型为。其次,如果要保留该类型结构,则需要一个