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

WAQ*_*AQT 3 java json gson kotlin

我有一个像这样的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"
    }]
  }]
}
Run Code Online (Sandbox Code Playgroud)

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
)
Run Code Online (Sandbox Code Playgroud)

因此,当我在不使用反序列化程序的情况下在Gson中正常解析JSON文件时,上述代码可以正常工作。但是,我不希望Log类存储Prices 的列表,因为我确定该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
)
Run Code Online (Sandbox Code Playgroud)

请问如何在Gson中完成此操作?我已经尝试了几个小时,但不确定如何解决。我也不确定是否需要为Response该类编写一个似乎需要大量工作的反序列化器,或者可以更轻松地完成它?任何指示或建议,将不胜感激。

Jof*_*rey 9

最好当然是更改API以更好地反映内容:如果价格清单实际上不是清单而是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]
}
Run Code Online (Sandbox Code Playgroud)