0

我在 android studio 中收到这样的 json 响应:

{
  "status": "ok",
  "data": {
        idx:7397,
        aqi:71,
        time:{
            v:1481396400,
            s:"2016-12-10 19:00:00",
            tz:"-06:00"
        },
        city:{
            name:"Chi_sp, Illinois",
            url:"https://aqicn.org/city/usa/illinois/chi_sp/",
            geo:["41.913600","-87.723900"]
        },
        iaqi:{
            pm25:{
                v:71
            }
        },
        forecast:{
            daily: {
                pm25: [{
                    avg: 154,
                    day: "2020-06-13",
                    max: 157,
                    min: 131
                }, {
                    avg: 163,
                    day: "2020-06-14",
                    max: 173,
                    min: 137
                }]
            }
        }
}

我想得到一些参数,比如aqi。我使用 Klaxon 库尝试了很多不同的方法,但没有一个结果。

4

2 回答 2

1

在 kotlin 中,您可以为复杂的 JSON 创建数据类,例如 -

class MyData<A>{
   lateinit var status: String
   var data : A? = null
}
class Data<B,C>{
   lateinit var idx: String
   lateinit var aqi: String
   var time: B?= null
   var city: C? = null
}
class Time{
   lateinit var v: String
   lateinit var s: String
   lateinit var tz: String
}
class City{
   lateinit var name: String
   lateinit var url: String
   lateinit var geo: List<String>
}

并与 klaxon 一起使用 -

val result = Klaxon().parse<MyData<Data<Time, City>>>(a)
于 2020-12-23T04:38:57.423 回答
0
    class MyData<A>{
        lateinit var status: String
        var data : A? = null
    }
    class Data<B,C>{
        lateinit var idx: String
        lateinit var aqi: String
        var time: B?= null
        var city: C? = null
    }
    class Time{
        lateinit var v: String
        lateinit var s: String
        lateinit var tz: String
    }
    class City{
        lateinit var name: String
        lateinit var url: String
        lateinit var geo: List<String>
    }    
val url = "https://...."
        val jsonObjectRequest = JsonObjectRequest(
            Request.Method.GET, url, null,
            { response ->
                val objectString = response.toString()

            val result = Klaxon().parse<MyData<Data<Time, City>>>(objectString)
            binding.result.text = "$result"
        },
        { error ->
           binding.aqi.text = "Something went wrong!\n Please try again!"
        }
    )

    // Access the RequestQueue through your singleton class.
    MySingleton.getInstance(activity!!.applicationContext).addToRequestQueue(jsonObjectRequest)

我尝试了该方法,但出现错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.cair, PID: 2718
java.lang.ClassCastException: libcore.reflect.TypeVariableImpl cannot be cast to java.lang.Class
    at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:200)
    at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:29)
    at com.beust.klaxon.JsonObjectConverter.retrieveKeyValues(JsonObjectConverter.kt:185)
    at com.beust.klaxon.JsonObjectConverter.initIntoUserClass(JsonObjectConverter.kt:67)
    at com.beust.klaxon.JsonObjectConverter.fromJson(JsonObjectConverter.kt:32)
    at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:204)
    at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:29)
    at com.beust.klaxon.Klaxon.fromJsonObject(Klaxon.kt:294)
    at com.example.cair.fragments.InfoFragment$onCreateView$jsonObjectRequest$1.onResponse(InfoFragment.kt:343)
    at com.example.cair.fragments.InfoFragment$onCreateView$jsonObjectRequest$1.onResponse(InfoFragment.kt:23)
    at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:90)
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:102)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7519)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:995)
于 2020-12-23T18:12:05.330 回答