Kotlinx 序列化 - 如何为未知字段名编写数据类

Posted

技术标签:

【中文标题】Kotlinx 序列化 - 如何为未知字段名编写数据类【英文标题】:Kotlinx serialization - How to write a data class for an unknown field name 【发布时间】:2021-07-11 06:41:25 【问题描述】:

我尝试为来自公共 API 的以下 JSON 响应编写数据类:


  "error": [],
  "result": 
    "AAVE": 
      "aclass": "currency",
      "altname": "AAVE",
      "decimals": 10,
      "display_decimals": 5
    ,
    "ADA": 
      "aclass": "currency",
      "altname": "ADA",
      "decimals": 8,
      "display_decimals": 6
    ,
    "ALGO": 
      "aclass": "currency",
      "altname": "ALGO",
      "decimals": 8,
      "display_decimals": 5
    ,
    "ANT": 
      "aclass": "currency",
      "altname": "ANT",
      "decimals": 10,
      "display_decimals": 5
      
  

我的数据类看起来像:

@Serializable
data class AssetInfo (
        @SerialName("error")
        val error: List<String>?,

        @SerialName("result")
        val result: Result,

)

@Serializable
data class Result(
/*
Here is the problem, because the field "asset_name" does not exist.
*/
        @SerialName("asset_name")
        val asset_name: Asset,

)

@Serializable
data class Asset(
        @SerialName("altname")
        val altname : String,

        @SerialName("aclass")
        val aclass  : String,

        @SerialName("decimals")
        val decimals  : String,

        @SerialName("display_decimals")
        val display_decimals  : String,
)

在数据类“Result”中,我声明为“asset_name”的字段名称对于每个条目都是不同的。数据类的外观如何?有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

Result 类中不需要。您的数据类应如下所示:

@Serializable
data class AssetInfo(
    @SerialName("error")
    val error: List<String>?,

    @SerialName("result")
    val result: Map<String, Asset>
)

@Serializable
data class Asset(
    @SerialName("altname")
    val altname: String,

    @SerialName("aclass")
    val aclass: String,

    @SerialName("decimals")
    val decimals: Int,

    @SerialName("display_decimals")
    val display_decimals: Int
)

【讨论】:

以上是关于Kotlinx 序列化 - 如何为未知字段名编写数据类的主要内容,如果未能解决你的问题,请参考以下文章

如何为计时时间戳使用自定义 serde 反序列化器?

在 kotlinx.serialization 中编码/解码 JSON“字符串”

如何为 GraphQL Mutation 字段编写解析器

如何为 PyYAML 编写表示器?

如何为包含特定函数数组的 JSON 对象编写接口

如何为 MySQL 中的字段或列设置别名?