使用 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
)
[
{
"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
)