【问题标题】:Get all nested JSON objects with GSON: Deserialization使用 GSON 获取所有嵌套的 JSON 对象:反序列化
【发布时间】:2020-02-25 07:17:07
【问题描述】:
[
   {
      "account":{
         "availableBalanceInCents":0.0,
         "unitCredits":[

         ],
         "accountId":2001003318,
         "currentBalanceInCents":0.0,
         "reservations":[],
         "accountSummary":{},
         "accountHistory":{},
         "status":8
      }
   },
   {
      "account":{
         "availableBalanceInCents":0.0,
         "unitCredits":[],
         "accountId":2001003318,
         "currentBalanceInCents":0.0,
         "reservations":[],
         "accountSummary":{},
         "accountHistory":{},
         "status":8
      }
   },
   {},
   {}
]

我想使用 gson 反序列化获取 account 的列表。请帮助我如何忽略空对象。

到目前为止,我已经做了类似的事情,但它返回了空对象。

val balance =
                GsonBuilder()
                    .create()
                    .fromJson<ArrayList<BalanceDetail>>(
                        JSONArray(data)
                            .toString(),
                        object : TypeToken<List<BalanceDetail>>() {}.type
                    )

【问题讨论】:

    标签: android json parsing kotlin gson


    【解决方案1】:

    你可以使用包装器:

    data class BalanceDetailWrapper(
        @SerializedName("account") val account: BalanceDetail?
    )
    

    然后像这样反序列化:

    val type = object : TypeToken<List<BalanceDetailWrapper>>() {}.type
    val balance = GsonBuilder().create()
                    .fromJson<ArrayList<BalanceDetailWrapper>>(JSONArray(data).toString(), type)
    

    【讨论】:

    • val balance 最后将是 LIST Account 还是只是一个对象?我需要ArrayList
    • 它将是List&lt;BalanceDetailWrapper&gt;
    • 但每次我需要做get(0).account 来呈现数据或将其分配给适配器。
    • 我们可以反序列化得到List&lt;BalanceDetail&gt;吗?这将很容易填充RecyclerView
    • 当然,您可以将数据映射到您想要的任何类型,例如:balance.mapNotNull{ it.account }。另一种选择是创建自定义TypeAdapter
    【解决方案2】:

    试试:

      val balance =
            GsonBuilder()
                .registerTypeHierarchyAdapter(
                    BalanceDetail::class.java,
                    object : JsonDeserializer<BalanceDetail?> {
                        override fun deserialize(
                            json: JsonElement?,
                            typeOfT: Type?,
                            context: JsonDeserializationContext?
                        ): BalanceDetail? {
                            return if (json?.asJsonObject?.entrySet()?.size == 0) {
                                null
                            } else {
                                Gson().fromJson(json, BalanceDetail::class.java)
                            }
                        }
    
                    })
                .create()
                .fromJson<ArrayList<BalanceDetail>>(
                    JSONArray(value)
                        .toString(),
                    object : TypeToken<List<BalanceDetail>>() {}.type
                )
    

    【讨论】:

    • 谢谢,我一定会试试的。
    【解决方案3】:

    在我看来,您只需要使用 List.filterNotNull() 函数过滤掉空元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2023-04-10
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多