Получить все вложенные JSON объекты с GSON: десериализация - PullRequest
0 голосов
/ 25 февраля 2020
[
   {
      "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
      }
   },
   {},
   {}
]

Я хочу получить список account с помощью десериализации gson. Пожалуйста, помогите, как я могу игнорировать пустой объект.

Я делал что-то подобное до сих пор, но он возвращает пустые объекты.

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

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Попробуйте:

  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
            )
1 голос
/ 25 февраля 2020

Вы можете использовать упаковщик:

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)
0 голосов
/ 25 февраля 2020

По-моему, вам нужно просто отфильтровать нулевые элементы с помощью функции List.filterNotNull()

...