2016-11-15 3 views
0

У меня есть быстрое приложение Swift 3, которое взаимодействует с сервером для получения данных. Теперь я могу успешно подключиться к серверу. Проблема в том, что когда я хочу получить конкретные данные из результата JSON, чтобы установить текстовое значение метки, я всегда получил значение Optional(x) в консоли, а значение метки всегда nil.Установить метку из результата JSONSerialization

Это формат моих данных, которые я получаю от сервера:

[A: 1, 
B: 2, 
C: 3] 

И это, как я получаю это:

let task = session.dataTask(with: request) { data, response, error in 

     do { 
      guard let data = data else { 
       throw JSONError.NoData 
      } 
      guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary else { 
       throw JSONError.ConversionFailed 
      } 
      self.labelA.text = json[“A”] as? String 

     } catch let error as JSONError { 
      print(error.rawValue) 
     } catch let error as NSError { 
      print(error.debugDescription) 
     } 
    } 
    task.resume() 

Edit: Я также могу получить те форматы:

Дело 1:

[ 
    { 
    id: 1, 
    fieldA: “nameA”, 
    fieldB: [“textA”, “textB", “textC”, “textD”], 
    fieldC: “nameC” 
    } 
] 

Случай 2:

{ 
    id: 1, 
    fieldA: “nameA”, 
    fieldB: [“textA”, “textB", “textC”, “textD”], 
    fieldC: “nameC” 
    } 

FieldB представляет собой массив из строки

ответ

1

Прежде всего не использовать NSDictionary в Свифт, если у вас нет выбора. Используйте родные типы Swift.

Во-вторых, значения результата в словаре, по-видимому, равны Int, а не String.

... 
    guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Int] else { 
     throw JSONError.ConversionFailed 
    } 
    if let jsonA = json["A"] { 
     self.labelA.text = "\(jsonA)" 
    } 

в случае значения String

... 
    guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:String] else { 
     throw JSONError.ConversionFailed 
    } 
    if let jsonA = json["A"] { 
     self.labelA.text = jsonA 
    } 

Случай 1 может быть проанализирован с помощью следующего кода, то ноль сливающихся оператор?? присваивает значение по умолчанию в случае, если ключ не существует ,

guard let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:Any]] else { 
     throw JSONError.ConversionFailed 
    } 
    for json in jsonArray { 
     let identifier = json["id"] as? Int ?? 0 
     let fieldA = json["fieldA"] as? String ?? "" 
     let fieldB = json["fieldB"] as? [String] ?? [String]() 
     let fieldC = json["fieldC"] as? String ?? "" 
    } 

Случай 2 представляет собой словарь [String:Any] и такой же, как случай 1, но без петли массива.

+0

Спасибо, что он работает! Не могли бы вы отредактировать свой ответ и сделать краткие примеры в случае [{A: 1, B: ["text1", "text2"], C: 3}], а также для случая {A: 1, B: 2, C: 3}? еще раз спасибо! –

+0

Что вы ожидаете в случае 'B: [" text1 "," text2 "]'? И ваши примеры непоследовательны. Пожалуйста, дайте все ваши примеры в действительных строках JSON. В настоящий момент они также представляют собой консольный вывод словаря с помощью команды печати. Это очень сложно отличить строковые и числовые типы. Измените свой вопрос, затем я отредактирую ответ. – vadian

+0

См. Мое редактирование –

0

Всегда запускать материал UI на главной теме:

if let text = json[“A”] as String { 
    DispatchQueue.main.async { 
     self.labelA.text = text 
    } 
} 
Смежные вопросы