提问人:Daviti Gogochishvili 提问时间:10/18/2023 最后编辑:ΓDΛDaviti Gogochishvili 更新时间:10/24/2023 访问量:49
如何使用自定义反序列化解析 Json 数据
how to parse Json data with custom deserialization
问:
我正在发送 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}")
}
}
答:
1赞
FOG
10/18/2023
#1
我正在使用改造来进行网络化。您也可以将 JSON 处理为 variabel
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. 谢谢谁回复!
评论