【问题标题】:Get data from nested json using GSON使用 GSON 从嵌套的 json 中获取数据
【发布时间】:2020-05-13 03:46:44
【问题描述】:

请您帮我理解如何使用 GSON 解析嵌套 json 文件中的数据。我查看了发布的其他类似问题,但看不到我在哪里犯了错误。我正在尝试从我的 json 文件中获取 id、用户、技术人员和帐户。

我的 JSON 文件如下所示:

{
  "operation": {
    "result": {
      "message": "successful",
      "status": "done"
    },
    "details": [
      {
        "id": "106818",
        "user": "Leona",
        "technician": "45441",
        "account": "Inc",
        "status": "Open"
      }
    ]
  }
}

代码:

        val url = "https://myURL"
        val request = Request.Builder().url(url).build()

        val client = OkHttpClient()
        client.newCall(request).enqueue(object :Callback{
            override fun onFailure(call: Call, e: IOException) {
                println("Failed - onFailure")
            }

            override fun onResponse(call: Call, response: Response) {
                val body = response?.body()?.string()
                println(body)

                val gson = GsonBuilder().create()
                gson.fromJson(body, HomeFeed::class.java)

               }

        })

    }
}


class HomeFeed(val details: List<Details>)
class Details(val id: String, val user:String, val technician:String, val account:String)   

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.kotlinjsontube, PID: 10905
    java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.Collection.size()' on a null object reference
        at com.example.kotlinjsontube.MainAdapter.getItemCount(MainAdapter.kt:13)

谢谢。

【问题讨论】:

  • details 字段位于 operation 字段内。
  • 你有什么错误吗?

标签: android json kotlin gson


【解决方案1】:

您的响应建模为 POJO 类:

模型.kt

data class Model(
  val operation: Operation,
  val details: List<Detail>
)

data class Operation(
  val result: Result
)

data class Result(
  val message: String,
  val status: String
)



data class Detail(
  val id: String,
  val user: String,
  val technician: String,
  val account: String,
  val status: String
)

您提出请求的类:

val url = "https://myURL"
val request = Request.Builder().url(url).build()

val client = OkHttpClient()
client.newCall(request).enqueue(object :Callback{
    override fun onFailure(call: Call, e: IOException) {
        println("Failed - onFailure")
    }

    override fun onResponse(call: Call, response: Response) {
        val body = response?.body()?.string()
        println(body)

        val gson = GsonBuilder().create()
        gson.fromJson(body, Model::class.java)

       }

})

【讨论】:

  • 非常感谢!这有助于我看到“操作”部分“模型(操作=操作(结果=结果(消息=成功,状态=完成)),详细信息=空)”但“详细信息”由于某种原因返回 null...
  • 我明白了!谢谢 !!!我们需要将“val details: List”移动到“data class Operation”
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多