gpt4 book ai didi

json - 有时对于两种不同的数据类型使用相同的 SerializedName,但使用 Kotlin

转载 作者:行者123 更新时间:2023-12-02 12:09:30 25 4
gpt4 key购买 nike

不幸的是,我从中提取的 JSON 文件有一个具有相同变量名称的节点,但可能随机具有两种不同的数据类型。当我进行网络调用(使用 gson)时,出现错误:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a BEGIN_ARRAY but was int at line 1 column 5344 path $[1].medium
JSON 看起来像

{
"title": "Live JSON generator",
"url": google.com,
"medium": ["chicken", "radio", "room"]
}
//However sometimes medium can be:
"medium": 259

我的序列化类看起来像:
data class SearchItem(
@SerializedName("title") var title: String,
@SerializedName("url") var urlStr: String,
@SerializedName("medium") val medium: List<String>? = null
) : Serializable {}

我打网络电话的方式是这样的:
private val api: P1Api

fun onItemClicked(searchItem: SearchItem) {
api.getCollections { response, error ->
response.toString()
val searchItems: List<SearchItem> = Util.gson?.fromJson<List<SearchItem>>(
response.get("results").toString()
, object : TypeToken<List<SearchItem>>() {}.type)?.toList()!!
...
doStuffWithSearchItems(searchItems)
}

我如何处理“中等”可以是字符串数组或可以是 Int 的两种情况?

最佳答案

您可以为这种情况编写自定义 JsonDeserializer:

class SearchItemCustomDeserializer: JsonDeserializer<SearchItem> {
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): SearchItem {
val obj = json.asJsonObject
val title = obj.get("title").asString
val url = obj.get("url").asString
val mediumProp = obj.get("medium")
val medium = if(mediumProp.isJsonArray) {
mediumProp.asJsonArray.map { it.asString }
} else {
listOf(mediumProp.asString)
}
return SearchItem(
title = title,
urlStr = url,
medium = medium
)
}
}

使用此类,您可以“手动”将 json 反序列化为对象。对于中等属性,我们检查是这个数组还是带有函数 mediumProp.isJsonArray 的简单 json 原语。 .如果答案是肯定的 - 然后将字段反序列化为 json 字符串数组 mediumProp.asJsonArray.map { it.asString }否则将字段反序列化为字符串。

然后我们使用方法 registerTypeAdapter 在 GsonBuilder 上注册我们的自定义 SearchItemCustomDeserializer
val gson = GsonBuilder()
.registerTypeAdapter(SearchItem::class.java, SearchItemCustomDeserializer())
.create()

在此之后,您可以使用此 gson 实例反序列化您的对象

关于json - 有时对于两种不同的数据类型使用相同的 SerializedName,但使用 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62142742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com