हैलो, मैं एंड्रॉइड स्टूडियो कोटलिन में नया हूं, और मैं इस मुद्दे में फंस गया हूं: मेरे पास OpenWeatherMap API द्वारा लौटाई गई JSON स्ट्रिंग है। इसी तरह का प्रश्न अतीत में प्रस्तुत किया गया था लिंक, लेकिन यह जावा था।

This is a typical string:

 {
    "coord": {
        "lon": -2.93,
        "lat": 43.26
    },
    "weather": [{
        "id": 801,
        "main": "Clouds",
        "description": "few clouds",
        "icon": "02n"
    }],
    "base": "stations",
    "main": {
        "temp": 60.69,
        "feels_like": 62.33,
        "temp_min": 59,
        "temp_max": 63,
        "pressure": 1023,
        "humidity": 100
    },
    "visibility": 10000,
    "wind": {
        "speed": 3.36,
        "deg": 120
    },
    "clouds": {
        "all": 20
    },
    "dt": 1602195029,
    "sys": {
        "type": 1,
        "id": 6395,
        "country": "ES",
        "sunrise": 1602224311,
        "sunset": 1602265138
    },
    "timezone": 7200,
    "id": 3128026,
    "name": "Bilbao",
    "cod": 200
}

और यह वह कोड है जो मेरे पास है:

package com.example.downloadtest

import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import org.json.JSONObject
import java.net.URL
import java.util.concurrent.Executors

val executor = Executors.newScheduledThreadPool(5)



class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        doAsync(executorService = executor) {
            //val result = URL("https://httpbin.org/get").readText()
            val result = URL("https://api.openweathermap.org/data/2.5/weather?q=Bilbao,spain&units=imperial&APPID=-------------").readText()
            val textView = findViewById(R.id.txtView) as TextView
            uiThread {
                //textView.setText(result)
                println(result)
                //toast(result)
                val data = StringBuilder()
                val jsonObject = JSONObject(result)
                val jsonArray = jsonObject.optJSONArray("weather")
                println(jsonArray)
                for (i in 0 until jsonArray.length()){
                    val jsonObject = jsonArray.getJSONObject(i)
                    val main = jsonObject.optString("main").toString()
                    val desc = jsonObject.optString("description").toString()
                    val icon = jsonObject.optString("icon").toString()
                    data.append("Bilbao Weather: \n").append(main).append(" : ").append(desc).append(" : ").append(icon)
                    textView.text = data.toString()
                }
            }
        }

    }

}

जैसा कि आप देख सकते हैं कि मैं स्ट्रिंग के एक हिस्से को पार्स कर सकता हूं, लेकिन मैं कुछ और पार्स नहीं कर सकता। अगर मैं "देश" या "नाम" को पार्स करना चाहता हूं, तो मैं इसके बारे में कैसे जाउंगा?

किसी भी मदद के लिए मेरा अग्रिम धन्यवाद।

रे।

0
Ray Castro 9 अक्टूबर 2020, 14:53

1 उत्तर

सबसे बढ़िया उत्तर

आपका जेसन नेस्टेड ऑब्जेक्ट्स से बना है। आप ऑब्जेक्ट को एक्सेस किए बिना किसी ऑब्जेक्ट के अंदर तक नहीं पहुंच सकते।

यदि आप description परम को एक्सेस करना चाहते हैं, तो आपको सबसे पहले weather को एक ऑब्जेक्ट बनाना होगा। country के लिए भी आपको sys से एक ऑब्जेक्ट बनाने की आवश्यकता है।

आप इसे इस तरह करेंगे:

val sys: JSONObject? = jsonObject.optJSONObject("sys") //this can be null (I don't know how consistent is that model)
val country = sys?.optString("country") ?: "" //if sys is null, default to empty string

नाम के लिए, यह प्रारंभिक वस्तु की एक संपत्ति है, इस प्रकार इसे इस तरह आसानी से पहुँचा जा सकता है:

val name = jsonObject.optString("name")

विचार करने वाली बात है: आप .toString() String पर क्यों कर रहे हैं?

फ़ंक्शन optString("fieldName", "fallback") हमेशा एक String लौटाएगा, यदि आप कोई फ़ॉलबैक प्रदान करते हैं तो वह उसका उपयोग करेगा, अन्यथा यह एक खाली String लौटाएगा

आपको (लंबे समय तक) भी ध्यान रखना चाहिए यदि आप एक ऐसी वस्तु बनाना चाहते हैं जो कि मॉडल है, और इसे जैक्सन या किसी अन्य पुस्तकालय के साथ मैप करें, तो आप उन्हें किसी अन्य जावा/कोटलिन पैरामीटर की तरह एक्सेस करेंगे।

0
Alex.T 9 अक्टूबर 2020, 17:15