当前位置: 首页 > 知识库问答 >
问题:

如何在Android kotlin、Moshi和Regetfit中解析带有动态键的嵌套JSON?

池宸
2023-03-14

如何在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
}

共有1个答案

谢俊英
2023-03-14

使用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等。 这是最高层,我还没有从结构内部弄清楚如何做到这一点。 问题答案: 首先,您尝试将根解析为,但其实际类型为。其次,如果要保留该类型结构,则需要一个