如何使用自定义反序列化解析 Json 数据

how to parse Json data with custom deserialization

提问人:Daviti Gogochishvili 提问时间:10/18/2023 最后编辑:ΓDΛDaviti Gogochishvili 更新时间:10/24/2023 访问量:49

问:

我正在发送 API 调用并得到这样的响应

{ "12312412312124123124": { "id": "12312412312124123124", "content": [ { "id": 41419969} ] },
"141412312412312521": { "id": 141412312412312521", "content": [ { "id": 41419969} ] }}

我如何处理解析这个json对象或为其创建数据类,我已经搜索了自定义反序列化,但找不到答案......

这是我的调用执行代码

   builder.build().newCall(request).execute().use { response ->

        if (response.isSuccessful) {
            val responseBody = response.body?.string()
          
            if (!responseBody.isNullOrBlank()) {
                val readings = gson.fromJson(responseBody, MyClassForParsing::class.java)
                
            } else {
                println("Response body is empty.")
            }
        } else {
            println("Request failed with code: ${response.code}")
        }
    }
Android JSON Kotlin 网络 改造

评论


答:

1赞 FOG 10/18/2023 #1

我正在使用改造来进行网络化。您也可以将 JSON 处理为 variabel

你可以在这里阅读: https://betterprogramming.pub/how-to-use-retrofit-for-networking-in-android-for-beginners-ef6bae5ef113

0赞 ΓDΛ 10/18/2023 #2

响应数据类(不要忘记添加@SerializedName)

data class ResponseType(
    var id: String?,
    var content: List<Content>?
)

data class Content(
    var id: Int?
)

变量键值在相关的 json 数据中可用

interface API {
    @GET("yourEndPoint")
    fun yourFunction(): Call<HashMap<String, ResponseType>>
}

最后一步调用排队

val call = service.getYourApiRequestFunction()

call.enqueue(object : Callback<HashMap<String, ResponseType>> {
    override fun onResponse(
        call: Call<HashMap<String, ResponseType>>,
        response: Response<HashMap<String, ResponseType>>
    ) {
        if (response.isSuccessful) {
            val responses = response.body()
            // your process - responses type ==== > HashMap<String, ResponseType>
        }
    }

    override fun onFailure(call: Call<HashMap<String, ResponseType>>, t: Throwable) {
        // your error case
    }
})

评论

0赞 Daviti Gogochishvili 10/19/2023
我收到一个错误:java.lang.RuntimeException:无法为 retrofit2 调用 no-args 构造函数。调用<java.util.HashMap<java.lang.String, com.remotetech.network.models.AssetResponse>>。将 InstanceCreator 注册到 Gson 中可能会解决此问题。
0赞 Daviti Gogochishvili 10/24/2023 #3

我已经找到了一个答案,以防万一,如果它对某人有帮助,我会在这里发布......

首先你需要得到作为响应的JsonObject,像这样:

suspend fun yourFunction() : JsonObject

那么你需要将该 JsonObject 存储在变量中

val call = service.yourFunction()

那么你需要这个函数

 fun parseStringParameterWithGsonKotlinDynamicKey(stringParameter: String): Map<String, Any?> {
    val gson = Gson()
    val jsonObject = gson.fromJson(stringParameter, JsonObject::class.java)

    val parsedParameters = mutableMapOf<String, Any?>()
    for ((key, value) in jsonObject.entrySet()) {
        parsedParameters[key] = value
    }

    return parsedParameters
}

创建另一个变量并调用此函数将 JsonObject 作为 String 传递,如下所示

val dfg= parseStringParameterWithGsonKotlinDynamicKey(call.toString())

届时,你将获得解析的 JSON 对象,其中包含您的对象,您可以迭代并获取如下所示的项目

dfg.entries.forEach { item ->
       val devices = Gson().fromJson(item.value.toString(),YuorDataClass::class.java)
   }

我希望有人能找到答案,我会让别人开心!

P.S. 谢谢谁回复!