使用 GSON 获取所有嵌套的 JSON 对象:反序列化

Get all nested JSON objects with GSON: Deserialization

[
   {
      "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 的列表。请帮助我如何忽略空对象。

到目前为止我已经做过类似的事情,但是它 returns 空对象。

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

您可以使用包装器:

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)

在我看来,您只需要使用 List.filterNotNull() 函数

过滤掉空元素

尝试:

  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
            )