如何在 kotlin 中转换这个复杂的 json

Posted

技术标签:

【中文标题】如何在 kotlin 中转换这个复杂的 json【英文标题】:How to convert this complex json in kotlin 【发布时间】:2021-11-09 04:01:35 【问题描述】:

我想将此 Json 文件转换为 kotlin :

   
    "results": 
        "ALL": 
            "currencyName": "Albanian Lek",
            "currencySymbol": "Lek",
            "id": "ALL"
        ,
        "XCD": 
            "currencyName": "East Caribbean Dollar",
            "currencySymbol": "$",
            "id": "XCD"
        
    



interface Api 

    @GET(ApiEndPoints.GET_CURRENCIES)
    suspend fun getCurrencies(
        @Query(Constants.API_KEY)
        countryCode: String = ApiEndPoints.API_KEY,
        @Query(Constants.FROM_TO)
        apiKey:String = "USD_USD",
        @Query("compact")
        compact:String = "ultra"
    ):CurrencyResults


型号:

data class CurrencyResults(
    val results: Map<String, Currency>
)

data class Currency(
    val currencyName: String,
    val currencySymbol: String,
    val id: String,
)

查看模型:

 init 
        viewModelScope.launch 
            //Should get result here 

        
    

它的 JSON 包含超过 100 个像上面这个 sn-p 的对象!我不能在这里得到它 当我尝试将其转换为 kotlin 时,我得到错误或 null 或必须编写超过 100 个类来检测所有 json 对象! 我想将它转换为 Currency 模型类来保存名称、符号和 id ! 我能做什么?

【问题讨论】:

你是如何转换这个 json 文件的? 这是我的问题 使用此链接将 json 响应转换为数据类。 json2kt.com @DnyaneshwarPatil 这个工具可能有助于编写代码本身,但它无助于定义它应该如何。它显然无法检测到对象的 JSON 键何时是动态的并指向相同类型的值,在这种情况下,该对象应该表示为映射而不是数据类。此外,它似乎生成了多个相同的数据类,而不是重复使用同一个。 【参考方案1】:

怎么样:

data class CurrencyResults(
    val results: Map<String, Currency>
)

data class Currency(
    val currencyName: String,
    val currencySymbol: String,
    val id: String,
)

【讨论】:

如何使用它? @GET(ApiEndPoints.GET_CURRENCIES) 暂停乐趣 getCurrencies(@Query(Constants.API_KEY) countryCode: String = ApiEndPoints.API_KEY, @Query(Constants.FROM_TO) apiKey:String = "USD_USD", @Query("compact") 紧凑: String = "ultra"):CurrencyResults 当我像这样使用它并从 viewModel 调用它时,它返回空列表!你能告诉我完整的例子吗【参考方案2】:

这个模型应该可以工作:

data class Currencies(val results : Map<String, Currency>)

data class Currency(val currencyName : String, val currencySymbol : String, val id : String)

您没有提及如何转换它们,使用 3rd 方库或其他方式,但是在您有未知键和一致的 Json 对象的情况下,使用 Map&lt;K, V&gt; 模型结构通常是标准的。

【讨论】:

如何使用它? @GET(ApiEndPoints.GET_CURRENCIES) 暂停乐趣 getCurrencies(@Query(Constants.API_KEY) countryCode: String = ApiEndPoints.API_KEY, @Query(Constants.FROM_TO) apiKey:String = "USD_USD", @Query("compact") 紧凑: String = "ultra"):CurrencyResults 当我像这样使用它并从 viewModel 调用它时,它返回空列表!你能告诉我完整的例子吗 完整代码来自您的问题...而不是 cmets。

以上是关于如何在 kotlin 中转换这个复杂的 json的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 的 Kotlin 中使用 GSON 将 JSON 对象转换为 JSON 数组

如何在 Kotlin Android 中将字符串转换为 JSON 对象 [重复]

如何将 C# 代码转换为 Kotlin 由 Json 库组成

如何在 Kotlin 中解析 JSON?

如何使用内容协商将 json 转换为 ktor 中的 kotlin 对象?

如何将这个复杂的Json转换为Dart对象