gpt4 book ai didi

android - 使用 Gson 解析 NoSQL 响应

转载 作者:行者123 更新时间:2023-11-30 05:02:07 24 4
gpt4 key购买 nike

我正在尝试解析从 mongoDB 实例返回的 JSON 对象,但在解析文档 ID 时遇到了问题。请参阅下面的示例响应:

{  
"type_id":"zyxwv54321",
"content":{
"contentsA":{
"abcd123":{ },
"efgh123":{ },
"ijkl123":{ },
"mnop123":{ },
"qrst123":{ },
"uvwx123":{ },
"yzab123":{ }
},
"contentsB":{
"abcd123":{ },
"efgh123":{ },
"ijkl123":{ },
"mnop123":{ },
"qrst123":{ },
"uvwx123":{ },
"yzab123":{ }
}
},
"manager":"mail@mail.com"
}

问题出在 contentsAcontentsB 中的对象,我该如何解析它们?这些对象中包含的每个字符串都是一个会发生变化的唯一 ID,因此鉴于这些键的未知性质,很难获得数据模型类。

最佳答案

您需要实现自己的自定义序列化器/反序列化器,它们可以使用动态键值解析 JSON。它不会很漂亮,但它并不可怕。并且实际上在性能方面提供了几个优势:

  1. 您的 JSON 不是一次全部解析,而是以流式方式解析
  2. 你可以用它做一些有趣的事情,因为你可以用一些响应式(Reactive)编程和一些持久存储来包装这些数据,并在你解析 JSON 时立即开始向用户显示一些东西(因为用户讨厌等待......)<

使用 GSON(但实际上任何库在概念上都是相似的)你需要在你的解析算法中描述你的对象 + implement a custom TypeAdapter这样您的网络调用就可以返回一个填充的数据模型类。所以像这样:

val jsonReader = JsonReader(inputStream.reader())
jsonReader.isLenient = true //I recommend reading up on this flag
jsonReader.beginObject()
parseInternals(jsonReader)
jsonReader.endObject()

现在在您的 parseInternal 函数中,您需要在流式传输响应时遍历字段并检查 JsonToken 类型(它是一个枚举)

fun parseInternals(jsonReader: JsonReader): YourDataModel {
//check there are still tokens to parse in your JSON
val yourDataModel = YourDataModel()
while (jsonReader.hasNext()) {
//name is a key in your JSON
if (jsonReader.peek() == JsonToken.NAME) {
val fieldName = jsonReader.readName()
if (fieldName == "type_id") {
dataModel.typeId = jsonReader.nextString()

}
//and so on until you populate your data model class
}
}
}

您的下一个标记将是 content,它作为另一个对象开始,因此您需要手动执行 jsonReader.begin/endObject() 直到获得那些动态键,它们只是您的解析器中的 nextName。确保使用 jsonReader.peek() 检查下一个标记的类型,并将其与您期望的类型进行比较。

编写解析器后,为它编写一些单元测试以确保它正在执行您期望的操作。这将有助于在 JSON 架构发生变化时进行 future 验证,以便您可以及早发现它。

关于android - 使用 Gson 解析 NoSQL 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084167/

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