首页 > 解决方案 > 我不能使用 Json 对象和凌空

问题描述

原木猫

我不能使用 Json 对象和 volley 请帮帮我我的英语很糟糕抱歉,我无法解决我的老师在我上的课程中无法理解的错误,因为我是初学者,模拟器关闭并给出这个工作时出错,当我尝试访问 apin 中的数据时它会爆炸,我无法理解问题所在。

    val url ="https://api.openweathermap.org/data/2.5/find?q=Ankara&appid=7ac4858bc53d5c6623bb4edd84b4b850&lang=tr&units=metric"
    val havadurumuObjeRequest= JsonObjectRequest(Request.Method.GET,url,null,object :Response.Listener<JSONObject>{
        override fun onResponse(response: JSONObject?) {


            var main = response?.getJSONObject("main")
            var sicaklik =main?.getInt("temp")

            tvSicaklik.text=sicaklik.toString()
            var sehiradi=response?.getString("name")
            tvSehir.text=sehiradi
            var weather=response?.getJSONArray("weather")
            var aciklama=weather?.getJSONObject(0)?.getString("description")
            tvAciklama.text=aciklama

            var icon=weather?.getJSONObject(0)?.getString("icon")
            var resimDosyaadi=resources.getIdentifier("icon_"+icon?.sonKarakterisil(),"drawable",packageName)
            imgHavaDurumu.setImageResource(resimDosyaadi)





        }


    },object :Response.ErrorListener{
        override fun onErrorResponse(error: VolleyError?) {


        }

    })
    MySingleton.getInstance(this)?.addToRequestQueue(havadurumuObjeRequest)
}

**

标签: androidjsonkotlin

解决方案


请检查您的 api,因为来自https://api.openweathermap.org/data/2.5/find?q=Ankara&appid=7ac4858bc53d5c6623bb4edd84b4b850&lang=tr&units=metric的响应是

{
  "message": "accurate",
  "cod": "200",
  "count": 2,
  "list": [
    {
      "id": 323786,
      "name": "Ankara",
      "coord": {
        "lat": 39.9199,
        "lon": 32.8543
      },
      "main": {
        "temp": 8.09,
        "feels_like": 4.97,
        "temp_min": 7,
        "temp_max": 9,
        "pressure": 1010,
        "humidity": 76
      },
      "dt": 1607911747,
      "wind": {
        "speed": 2.6,
        "deg": 70
      },
      "sys": {
        "country": "TR"
      },
      "rain": null,
      "snow": null,
      "clouds": {
        "all": 75
      },
      "weather": [
        {
          "id": 803,
          "main": "Clouds",
          "description": "parçalı bulutlu",
          "icon": "04n"
        }
      ]
    },
    {
      "id": 323784,
      "name": "Ankara",
      "coord": {
        "lat": 39.9167,
        "lon": 32.8333
      },
      "main": {
        "temp": 8.11,
        "feels_like": 5,
        "temp_min": 7,
        "temp_max": 9,
        "pressure": 1010,
        "humidity": 76
      },
      "dt": 1607911508,
      "wind": {
        "speed": 2.6,
        "deg": 70
      },
      "sys": {
        "country": "TR"
      },
      "rain": null,
      "snow": null,
      "clouds": {
        "all": 75
      },
      "weather": [
        {
          "id": 803,
          "main": "Clouds",
          "description": "parçalı bulutlu",
          "icon": "04n"
        }
      ]
    }
  ]
}

所以我们有list一个 JsonArray,所以要获取main, temp... 值,需要解析

// We get list info (This is an array)
val jArr = jObj.getJSONArray("list");

// I just use only first value, if you want use all, use loop instead 
val JSONdata = jArr.getJSONObject(0);

// then use as your code 
var main = JSONdata?.getJSONObject("main")
            var sicaklik = main?.getInt("temp")

            tvSicaklik.text = sicaklik.toString()
            var sehiradi = JSONdata?.getString("name")
            tvSehir.text = sehiradi
            var weather = JSONdata?.getJSONArray("weather")
            var aciklama = weather?.getJSONObject(0)?.getString("description")
            tvAciklama.text = aciklama

            var icon = weather?.getJSONObject(0)?.getString("icon")
            var resimDosyaadi = resources.getIdentifier("icon_"+icon?.sonKarakterisil(),"drawable",packageName)
            imgHavaDurumu.setImageResource(resimDosyaadi)

推荐阅读