Json 有时两种不同数据类型的SerializedName相同,但使用Kotlin

Json 有时两种不同数据类型的SerializedName相同,但使用Kotlin,json,kotlin,types,gson,derivative,Json,Kotlin,Types,Gson,Derivative,不幸的是,我从中提取的JSON文件有一个具有相同变量名的节点,但可能随机具有两种不同的数据类型。当我进行网络呼叫(使用gson)时,我得到错误: com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_数组,但在第1行第5344列路径$[1]处为int。中等 JSON看起来像 { "title": "Live JSON generator", "url": google.com, "med

不幸的是,我从中提取的JSON文件有一个具有相同变量名的节点,但可能随机具有两种不同的数据类型。当我进行网络呼叫(使用gson)时,我得到错误:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_数组,但在第1行第5344列路径$[1]处为int。中等

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 {}
数据类搜索项(
@SerializedName(“title”)变量title:String,
@SerializedName(“url”)变量urlStr:String,
@SerializedName(“介质”)val介质:列表?=null
):可序列化{}
我打网络电话的方式如下:

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)
}
private-val-api:P1Api
单击(searchItem:searchItem){
api.getCollections{响应,错误->
response.toString()
val searchItems:List=Util.gson?.fromJson(
response.get(“results”).toString()
,对象:TypeToken(){}.type)→toList()!!
...
doStuffWithSearchItems(搜索项)
}

如何处理“medium”可以是字符串数组,也可以是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
        )
    }
}
在这之后,您可以使用这个gson实例来反序列化您的对象

val gson = GsonBuilder()
    .registerTypeAdapter(SearchItem::class.java, SearchItemCustomDeserializer())
    .create()