Как большинство людей делают это, чтобы разобрать досадные данные JSON как пользовательские объекты. Это должно быть сделано, как только вы получите JSON. В идеале, данные в виде JSON не должны использоваться за пределами вашего кода связи, например:
Во-первых, давайте определим класс для хранения данных сервера:
class MyServerObject {
let typeId: Int
let typeName: String
let dataList: [AnyObject]?
init(dictionary: Dictionary<String, AnyObject>) {
let dataDictionary = dictionary["data"] as! Dictionary<String, AnyObject>
self.typeId = dataDictionary["TypeId"] as! Int
self.typeName = dataDictionary["TypeName"] as! String
self.dataList = dataDictionary["DataList"] as? [AnyObject]
}
}
Обратите внимание, что init
метод уже разбора JSON. Это не нужно делать в init
, вы также можете создать статический метод parse
, который вернет новый экземпляр.
Использование:
// demo data
let jsonString = "{\"data\": {\"TypeId\":7,\"DataList\":null,\"TypeName\":\"This is a test\"}}"
let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
let json = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// parsing
let myServerObject = MyServerObject(dictionary: json as! Dictionary<String, AnyObject>)
// now we can simply read data as properties
print(myServerObject.typeId)
print(myServerObject.typeName)
Одна из хороших вещей об этом решении является то, что мы можем проверить формат JSON и все свойства обрабатываются с правильными типами.
Синтаксические может быть иерархическими, например, если ваш dataList
содержит сложные объекты, давайте назовем их DataListItem
, ваш метод разбора может разобрать каждый элемент по отдельности и поместить их в [DataListItem]
, например,
if let dataListJSON = dataDictionary["DataList"] as? [Dictionary<String, AnyObject>] {
self.dataList = dataListJSON.map({ DataListItem($0) })
}
Также обратите внимание, что при разборе as!
произойдет сбой приложения, если формат является недопустимым. as?
вернет nil
, если типы не совпадают. as?
очень полезен для типов, которые могут быть nil
, потому что они разобраны как NSNull
экземпляров.
анализировать данные из словарей в пользовательские объекты. Не всегда важно хранить данные в качестве словарей. – Sulthan
Да, я бы очень хотел. Но эти данные поступают с сервера, поэтому мне нужно найти способ его прочитать. – Anfaje