【问题标题】:Gson deserialise - avoid wrapper classGson 反序列化 - 避免包装类
【发布时间】:2018-10-30 13:58:58
【问题描述】:

我正在尝试在 Kotlin 中使用 Gson 反序列化以下 JSON。

{
  "things": [
    {
      "name": "Thing1"
    },
    {
      "name": "Thing2"
    }
  }
}

现在我有 2 个要反序列化的类;

  1. ThingWrapper - 有一个属性“事物”,它是一个列表
  2. 事物 - 具有名称属性

在我的服务中,我只是从“事物”返回List<Thing>,并且从不暴露 ThingWrapper。

fun getThings(): List<Thing> {
   return Gson().fromJson(json, ThingWrapper::class.java).things
}

我的问题是我可以使用 Gson 以一种可以完全避免需要 ThingWrapper 类的方式反序列化吗?

提前致谢, 约翰

【问题讨论】:

  • 如果你使用 Retrofit & Gson 来解析这个 JSON,移除 ThingWrapper.class 并传递 List of things,所以它只会解析 things
  • @AkshayKatariya 我目前没有使用 Retrofit,我有意尝试直接在 Gson 中解决这个问题。只是为了确认您是说在 Retrofit 中您可以预先解析响应以仅提取数组吗?
  • 是的,您可以消除不需要的参数,它只会解析您 POJO 中存在的那些参数,我认为您也可以尝试使用 Gson
  • 谢谢,当我开始使用 Retrofit 时,我会记住这一点。

标签: android json kotlin gson


【解决方案1】:

如果要去掉 Wrapper 类,可以使用JSONObject 类解析对象,然后从中提取 JSON 数组。

val things: List<Thing> = Gson().fromJson(
            JSONObject(json).getJSONArray("things").toString(),
            object : TypeToken<List<Thing>>() {}.type)
Log.i("output", things.toString())

I/输出:[Thing(name=Thing1), Thing(name=Thing2)]

这对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多