প্রথমত কোনও দূরবর্তী ইউআরএল থেকে কখনই ডেটা সিঙ্ক্রোনালি লোড করবেন না , সর্বদা মত অ্যাসিনক্রোনাস পদ্ধতি ব্যবহার করুন URLSession
।
'যে কোনও'র কোনও সাবস্ক্রিপ্ট সদস্য নেই
ঘটে কারণ কম্পাইলার কি টাইপ অন্তর্বর্তী বস্তু (উদাহরণস্বরূপ হয় কোন ধারণা আছে currently
এ ["currently"]!["temperature"]
) এবং আপনার মত ফাউন্ডেশন সংগ্রহ ধরনের ব্যবহার করছেন যেহেতু NSDictionary
কম্পাইলার ধরনের সম্পর্কে সব সময়ে কোন ধারণা নেই।
অতিরিক্ত হিসাবে সুইফট 3 এ সমস্ত সাবস্ক্রিপশনযুক্ত সামগ্রীর ধরণের সম্পর্কে সংকলককে অবহিত করা প্রয়োজন ।
আপনাকে জেএসওএন সিরিয়ালাইজের ফলাফলটি প্রকৃত প্রকারে দিতে হবে।
এই কোডটি ব্যবহার করে URLSession
এবং একচেটিয়াভাবে সুইফট নেটিভ প্রকারগুলি
let urlString = "https://api.forecast.io/forecast/apiKey/37.5673776,122.048951"
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print(error)
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any]
let currentConditions = parsedData["currently"] as! [String:Any]
print(currentConditions)
let currentTemperatureF = currentConditions["temperature"] as! Double
print(currentTemperatureF)
} catch let error as NSError {
print(error)
}
}
}.resume()
আপনার সমস্ত কী / মান currentConditions
জোড় লিখতে পারে
let currentConditions = parsedData["currently"] as! [String:Any]
for (key, value) in currentConditions {
print("\(key) - \(value) ")
}
সম্পর্কিত একটি নোট jsonObject(with data
:
অনেকগুলি (এটি সমস্ত মনে হয়) টিউটোরিয়ালগুলি প্রস্তাব দেয় .mutableContainers
বা .mutableLeaves
বিকল্পগুলি যা সুইফটে সম্পূর্ণ বোকা। দুটি বিকল্প হ'ল উত্তরাধিকারী অবজেক্টিভ-সি বিকল্পগুলি NSMutable...
বস্তুগুলিতে ফলাফল নির্ধারণের জন্য । var
সুইফ্টে যে কোনও আইবলযোগ্য ডিফল্টরূপে পরিবর্তনযোগ্য এবং সেগুলির মধ্যে যে কোনও একটি বিকল্পকে পাস করা এবং ফলাফলকে let
ধ্রুবককে নির্ধারণের কোনও প্রভাব নেই has আরও বেশিরভাগ বাস্তবায়ন কখনই যাইহোক ডিসরিয়ালাইজড জেএসএনকে রূপান্তরিত করে না।
শুধুমাত্র (বিরল) বিকল্প যা সুইফট দরকারী হয় .allowFragments
যা যদি তাদেরকে JSON রুট বস্তুর একটি মান টাইপ হতে পারে প্রয়োজন হয় ( String
, Number
, Bool
বা null
) বদলে সংগ্রহ ধরনের এক ( array
বা dictionary
)। তবে সাধারণত options
প্যারামিটারটি বাদ দিন যার অর্থ কোনও বিকল্প নেই ।
================================================== =========================
জেএসনকে পার্স করার জন্য কিছু সাধারণ বিবেচনা
জেএসএন একটি সুবিন্যস্ত পাঠ্য বিন্যাস। একটি JSON স্ট্রিং পড়া খুব সহজ। স্ট্রিং সাবধানে পড়ুন । এখানে ছয়টি বিভিন্ন ধরণের রয়েছে - দুটি সংগ্রহের ধরণ এবং চারটি মান প্রকার।
সংগ্রহের ধরণগুলি হ'ল
- অ্যারে - জেএসওএন: বর্গাকার বন্ধনীতে বস্তু
[]
- সুইফট: [Any]
তবে বেশিরভাগ ক্ষেত্রে[[String:Any]]
- অভিধান - JSON: কোঁকড়া ধনুর্বন্ধনী মধ্যে বস্তু
{}
- সুইফট:[String:Any]
মান ধরণের হয়
- স্ট্রিং - জেএসওএন: ডাবল কোটগুলির যে কোনও মান
"Foo"
, এমনকি "123"
বা "false"
- সুইফট:String
- নম্বর - তাদেরকে JSON: সাংখ্যিক মান না উদ্ধৃতি চিহ্ন মধ্যে
123
বা 123.0
- সুইফট: Int
বাDouble
- Bool - তাদেরকে JSON:
true
বা false
না উদ্ধৃতি চিহ্ন মধ্যে - সুইফট: true
বাfalse
- নাল - জেএসওএন:
null
- সুইফট:NSNull
জেএসএন স্পেসিফিকেশন অনুসারে অভিধানের সমস্ত কী থাকা দরকার String
।
মূলত এটি সর্বদা optionচ্ছিক বাইন্ডিংগুলি নিরাপদে unচ্ছিকভাবে মোড়কগুলিতে ব্যবহার করার জন্য পুনঃসংশ্লিষ্ট
মূল অবজেক্ট যদি অভিধান হয় ( {}
) এ টাইপ করুন[String:Any]
if let parsedData = try JSONSerialization.jsonObject(with: data!) as? [String:Any] { ...
এবং কীগুলির সাহায্যে মানগুলি পুনরুদ্ধার করুন ( OneOfSupportedJSONTypes
হয় জেএসওএন সংগ্রহ বা উপরে বর্ণিত মানের ধরণ))
if let foo = parsedData["foo"] as? OneOfSupportedJSONTypes {
print(foo)
}
মূল অবজেক্টটি যদি একটি অ্যারে হয় ( []
) এ টাইপ করুন[[String:Any]]
if let parsedData = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] { ...
এবং অ্যারের মাধ্যমে পুনরাবৃত্তি
for item in parsedData {
print(item)
}
নির্দিষ্ট সূচীতে আপনার যদি আইটেমের প্রয়োজন হয় তবেও সূচকের উপস্থিতি আছে কিনা তা পরীক্ষা করে দেখুন
if let parsedData = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]], parsedData.count > 2,
let item = parsedData[2] as? OneOfSupportedJSONTypes {
print(item)
}
}
দুর্লভ ক্ষেত্রে যে জেএসওএন কেবলমাত্র এক ধরণের মান ধরণের - কোনও সংগ্রহের ধরণের চেয়ে - আপনাকে .allowFragments
বিকল্পটি পাস করতে হবে এবং ফলস্বরূপ উপযুক্ত মানের ধরণে ফল দিতে হবে উদাহরণস্বরূপ
if let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? String { ...
অ্যাপল একটি শীর্ষ নিবন্ধ প্রকাশ করেছে সুইফট ব্লগে: সুইফটে জেএসএন এর সাথে কাজ করা
================================================== =========================
সুইফট 4+ এ Codable
প্রোটোকল জেএসএনকে সরাসরি স্ট্রাক্ট / ক্লাসে পার্স করার জন্য আরও সুবিধাজনক উপায় সরবরাহ করে।
উদাহরণস্বরূপ প্রশ্নে প্রদত্ত জেএসএন নমুনা (কিছুটা সংশোধিত)
let jsonString = """
{"icon": "partly-cloudy-night", "precipProbability": 0, "pressure": 1015.39, "humidity": 0.75, "precip_intensity": 0, "wind_speed": 6.04, "summary": "Partly Cloudy", "ozone": 321.13, "temperature": 49.45, "dew_point": 41.75, "apparent_temperature": 47, "wind_bearing": 332, "cloud_cover": 0.28, "time": 1480846460}
"""
স্ট্রাক্ট মধ্যে ডিকোড করা যেতে পারে Weather
। উপরের বর্ণিত সুইফট প্রকারগুলি একই রকম। কয়েকটি অতিরিক্ত বিকল্প রয়েছে:
- স্ট্রিংগুলির প্রতিনিধিত্ব করে স্ট্রিংগুলি
URL
সরাসরি ডিকোড করা যায় URL
।
time
পূর্ণসংখ্যা হিসাবে সঙ্কেতমুক্ত করা যেতে পারে Date
সঙ্গে dateDecodingStrategy
.secondsSince1970
।
- snaked_cased তাদেরকে JSON কী কাজে রূপান্তরিত হতে পারে ক্যামেলকেস সঙ্গে
keyDecodingStrategy
.convertFromSnakeCase
struct Weather: Decodable {
let icon, summary: String
let pressure: Double, humidity, windSpeed : Double
let ozone, temperature, dewPoint, cloudCover: Double
let precipProbability, precipIntensity, apparentTemperature, windBearing : Int
let time: Date
}
let data = Data(jsonString.utf8)
do {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .secondsSince1970
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Weather.self, from: data)
print(result)
} catch {
print(error)
}
অন্যান্য কোডেবল উত্স: