【问题标题】:How to parse JSON with dynamic field names with Gson in Kotlin?如何在 Kotlin 中使用 Gson 解析带有动态字段名称的 JSON?
【发布时间】:2020-04-22 22:53:26
【问题描述】:

我看了很多文章,但似乎无法找出答案。问题是我从我的 api 中得到了一个这样的 json 文件:

{
    "forecast": {
        "2020-01-04": {
            "date": "2020-01-04",
            "mintemp": 7,
            "maxtemp": 11,
            "avgtemp": 9,
            "hourly": 
             ...
        }
    }
}

问题在于,这个 JSON 中的“关键”始终是今天(2020-01-04)。我现在这样做的方式是这样的:

data class ForecastDaysContainer(
    @SerializedName("2020-01-04")
    var forecastday1: FutureWeatherEntry,
    @SerializedName("2020-01-05")
    val forecastday2: FutureWeatherEntry,
    @SerializedName("2020-01-06")
    val forecastday3: FutureWeatherEntry,
    @SerializedName("2020-01-07")
    val forecastday4: FutureWeatherEntry,
    @SerializedName("2020-01-08")
    val forecastday5: FutureWeatherEntry,
    @SerializedName("2020-01-09")
    val forecastday6: FutureWeatherEntry,
    @SerializedName("2020-01-10")
    val forecastday7: FutureWeatherEntry
)

这当然会导致我每天手动更改日期。

有什么方法可以将@SerializedName 设置为今天的日期?当我尝试这个时:

LocalDate.now().toString()

我得到错误:

注解参数必须是编译时常量

我似乎无法在 Kotlin 中找到合适的解决方案。

【问题讨论】:

标签: json kotlin annotations gson localdate


【解决方案1】:

Gson 有 parse() 方法。

val key = "2020-01-04" // This is generated, probably?
val json = JsonParser().parse(jsonString)
val result = json.asJsonObject["forecast"].asJsonObject[key]

【讨论】:

    【解决方案2】:

    无法动态创建注释数据。所以你需要反过来想。使用 Gson,您可以尝试实现自定义 JsonDeserializer,以根据该日期值动态解析字段。

    但是我认为最方便的方法是使用Map 作为评论建议。如果你可以让你的ForecastDaysContainer 像这样:

    data class ForecastDaysContainer(
        var forecast : Map<String, FutureWeatherEntry>
    )
    

    反序列化后,您将拥有一个可能包含多天的 Map,其中日期为键。比如:

    val container = gson.fromJson(json, ForecastDaysContainer::class.java);
    val forecast = container.forecast.get("2020-01-04");
    

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2011-11-30
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多