2016-03-13 3 views
0

Приносим извинения за звание этого вопроса. Я понятия не имею, что еще назвать.Извлечь ценность из словаря раздражающего формата

Итак ... При вызове следующее:

let testData: [NSObject : AnyObject] = getTestData() 
print(testData) 

я получаю этот выход:

[data: {"TypeId":7,"DataList":null,"TypeName":"This is a test"}] 

Как я смог бы получить доступ к значению 7 для ключа "TypeID"?

EDIT: Обратите внимание: это держит скобки {}, а не только [], поэтому приведение в NSDictionary невозможно, насколько я пробовал.

С наилучшими пожеланиями, Андерс

+1

анализировать данные из словарей в пользовательские объекты. Не всегда важно хранить данные в качестве словарей. – Sulthan

+0

Да, я бы очень хотел. Но эти данные поступают с сервера, поэтому мне нужно найти способ его прочитать. – Anfaje

ответ

0

Вы можете достичь Plist, как вложенные структур с использованием любого типа для значений словаря, который Свифт несколько аналога типа идентификатора Objective-C, но также может содержать типы значений.

вар ответ = Dictionary()

ответ [ "пользователь"] = [ "Войти": "Power Ranger", "Пароль": "Могучий Морфин]

ответа [" статус" ] = 200

Любое кажется лучше, чем AnyObject, потому что в приведенном выше ответе кода ["status"] имеет тип Swift.Int, при использовании типа значения AnyObject это __NSCFNumber.

+0

Я не вижу, как это ответ, пожалуйста, уточните. – Anfaje

0

Как большинство людей делают это, чтобы разобрать досадные данные 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 экземпляров.

0

принимая во внимание ваши данные ...

print(testData) 
/* 
[data: { 
    DataList = null; 
    TypeId = 7; 
    TypeName = "This is a test"; 
}] 
*/ 

// DataList type should be declared somewhere 
class DataList {} 

// parse data or set default value, if 'key' doesn't exist 
if let data = testData["data"] as? [String:AnyObject] { 

    let dataList = data["DataList"] as? DataList  // nil 
    let typeId = data["TypeId"] as? Int ?? 0   // 7 
    let typeName = data["TypeName"] as? String ?? "" // This is test 

} 
+0

Я не переживаю вашу стражу. Обратите внимание, что он удерживает {} скобки, а не только []. – Anfaje

+0

Как вы видите, оба [] и {} являются частью моего ответа ... Это ваше дело, не так ли? – user3441734

+0

let data = testData ["data"] as? [String: AnyObject] возвращает nil в моем коде. – Anfaje

Смежные вопросы