gpt4 book ai didi

java - Gson如何将已知大小的列表转换为多个字段

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:52:36 25 4
gpt4 key购买 nike

我有一个像这样的 Json 格式:

{
"kind": "prediction",
"command": "true",
"logs": [{
"time_log": "12:00",
"date": "2019-07-17",
"prices": [{
"state": "past",
"count": "128"
}, {
"state": "present",
"type": "255"
}, {
"state": "future",
"count": "300"
}]
}, {
"time_log": "12:00",
"date": "2019-07-18",
"prices": [{
"state": "past",
"count": "255"
}, {
"state": "present",
"type": "308"
}, {
"state": "future",
"count": "400"
}]
}]
}

在 Kotlin 中表示解析数据的类是 Response(顶级 JSON)和其他类:

data class Response(
val kind: String,
val command: String,
val logs: List<Log>
)

data class Log(
val time_log: String,
val date: String,
val prices: List<Price>
)

data class Price(
val state: String,
val count: String
)

所以当我在没有反序列化器的情况下在 Gson 中正常解析 JSON 文件时,上面的代码工作正常。但是,我不希望 Log 类存储 Price 列表,因为我确信 prices 数组将只包含 3元素,所以我想将它们中的每一个存储在 Log 类中的单独字段中,例如:

data class Log(
val time_log: String,
val date: String,
val past_price: Price,
val present_price: Price,
val future_price: Price
)

请问如何在 Gson 中完成此操作?我已经尝试了几个小时,但不确定如何去做。我也不确定我是否需要为 Response 类编写反序列化器,这看起来工作量很大,还是可以更轻松地完成?任何指示或建议将不胜感激。

最佳答案

当然,最好的办法是更改 API 以更好地反射(reflect)内容:如果价格列表实际上不是列表而是 3 个具体价格,那么 API 应该首先以这种方式返回。

如果您不控制 API,避免自定义反序列化器复杂性的一个简单解决方案是保留列表,但添加几个属性以更方便地访问列表:

data class Log(
val time_log: String,
val date: String,
private val prices: List<Price>
) {
val pastPrice: Price
get() = prices[0]
val presentPrice: Price
get() = prices[1]
val futurePrice: Price
get() = prices[2]
}

关于java - Gson如何将已知大小的列表转换为多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com