हैलो, मैं एंड्रॉइड स्टूडियो कोटलिन में नया हूं, और मैं इस मुद्दे में फंस गया हूं: मेरे पास 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()
}
}
}
}
}
जैसा कि आप देख सकते हैं कि मैं स्ट्रिंग के एक हिस्से को पार्स कर सकता हूं, लेकिन मैं कुछ और पार्स नहीं कर सकता। अगर मैं "देश" या "नाम" को पार्स करना चाहता हूं, तो मैं इसके बारे में कैसे जाउंगा?
किसी भी मदद के लिए मेरा अग्रिम धन्यवाद।
रे।
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
लौटाएगा
आपको (लंबे समय तक) भी ध्यान रखना चाहिए यदि आप एक ऐसी वस्तु बनाना चाहते हैं जो कि मॉडल है, और इसे जैक्सन या किसी अन्य पुस्तकालय के साथ मैप करें, तो आप उन्हें किसी अन्य जावा/कोटलिन पैरामीटर की तरह एक्सेस करेंगे।
संबंधित सवाल
नए सवाल
json
JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) मशीन और मानव पठनीय होने के लिए एक क्रमबद्ध डेटा इंटरचेंज प्रारूप है। इस टैग का उपयोग देशी जावास्क्रिप्ट वस्तुओं या जावास्क्रिप्ट ऑब्जेक्ट शाब्दिकों के लिए न करें। इससे पहले कि आप कोई प्रश्न पूछें, एक JSON सत्यापनकर्ता जैसे JSONLint (https://jsonlint.com) का उपयोग करके अपने JSON को मान्य करें।