আমি এই উদ্ধৃতি থেকে কিছু অনুপ্রেরণা পেয়েছি, আমি UnkeyedDecodingContainer
এবং এর জন্য কিছু এক্সটেনশন লিখেছি KeyedDecodingContainer
। আপনি আমার টুকরোটির লিঙ্কটি এখানে পেতে পারেন । এই কোডটি ব্যবহার করে আপনি এখন যে কোনও Array<Any>
বা Dictionary<String, Any>
পরিচিত সিনট্যাক্সের সাথে ডিকোড করতে পারেন :
let dictionary: [String: Any] = try container.decode([String: Any].self, forKey: key)
বা
let array: [Any] = try container.decode([Any].self, forKey: key)
সম্পাদনা করুন: আমি খুঁজে পেয়েছি এমন একটি ক্যাভেট রয়েছে যা অভিধানের একটি অ্যারে ডিকোড করছে যা [[String: Any]]
প্রয়োজনীয় বাক্য গঠনটি নিম্নরূপ। আপনি সম্ভবত বল প্রয়োগের পরিবর্তে একটি ত্রুটি নিক্ষেপ করতে চান:
let items: [[String: Any]] = try container.decode(Array<Any>.self, forKey: .items) as! [[String: Any]]
সম্পাদনা 2: আপনি যদি কেবল একটি সম্পূর্ণ ফাইলকে একটি অভিধানে রূপান্তর করতে চান তবে আপনি JSONSerialization থেকে এপিআই দিয়ে আটকে থাকা ভাল কারণ আমি কোনও অভিধান ডিকোড করার জন্য নিজেই JSONDecoder প্রসারিত করার উপায় খুঁজে পাইনি।
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
return
}
এক্সটেনশনগুলি
struct JSONCodingKeys: CodingKey {
var stringValue: String
init?(stringValue: String) {
self.stringValue = stringValue
}
var intValue: Int?
init?(intValue: Int) {
self.init(stringValue: "\(intValue)")
self.intValue = intValue
}
}
extension KeyedDecodingContainer {
func decode(_ type: Dictionary<String, Any>.Type, forKey key: K) throws -> Dictionary<String, Any> {
let container = try self.nestedContainer(keyedBy: JSONCodingKeys.self, forKey: key)
return try container.decode(type)
}
func decodeIfPresent(_ type: Dictionary<String, Any>.Type, forKey key: K) throws -> Dictionary<String, Any>? {
guard contains(key) else {
return nil
}
guard try decodeNil(forKey: key) == false else {
return nil
}
return try decode(type, forKey: key)
}
func decode(_ type: Array<Any>.Type, forKey key: K) throws -> Array<Any> {
var container = try self.nestedUnkeyedContainer(forKey: key)
return try container.decode(type)
}
func decodeIfPresent(_ type: Array<Any>.Type, forKey key: K) throws -> Array<Any>? {
guard contains(key) else {
return nil
}
guard try decodeNil(forKey: key) == false else {
return nil
}
return try decode(type, forKey: key)
}
func decode(_ type: Dictionary<String, Any>.Type) throws -> Dictionary<String, Any> {
var dictionary = Dictionary<String, Any>()
for key in allKeys {
if let boolValue = try? decode(Bool.self, forKey: key) {
dictionary[key.stringValue] = boolValue
} else if let stringValue = try? decode(String.self, forKey: key) {
dictionary[key.stringValue] = stringValue
} else if let intValue = try? decode(Int.self, forKey: key) {
dictionary[key.stringValue] = intValue
} else if let doubleValue = try? decode(Double.self, forKey: key) {
dictionary[key.stringValue] = doubleValue
} else if let nestedDictionary = try? decode(Dictionary<String, Any>.self, forKey: key) {
dictionary[key.stringValue] = nestedDictionary
} else if let nestedArray = try? decode(Array<Any>.self, forKey: key) {
dictionary[key.stringValue] = nestedArray
}
}
return dictionary
}
}
extension UnkeyedDecodingContainer {
mutating func decode(_ type: Array<Any>.Type) throws -> Array<Any> {
var array: [Any] = []
while isAtEnd == false {
if try decodeNil() {
continue
} else if let value = try? decode(Bool.self) {
array.append(value)
} else if let value = try? decode(Double.self) {
array.append(value)
} else if let value = try? decode(String.self) {
array.append(value)
} else if let nestedDictionary = try? decode(Dictionary<String, Any>.self) {
array.append(nestedDictionary)
} else if let nestedArray = try? decode(Array<Any>.self) {
array.append(nestedArray)
}
}
return array
}
mutating func decode(_ type: Dictionary<String, Any>.Type) throws -> Dictionary<String, Any> {
let nestedContainer = try self.nestedContainer(keyedBy: JSONCodingKeys.self)
return try nestedContainer.decode(type)
}
}