2016-11-15 59 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() 

编辑: 我也可以得到这些格式:

案例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中,除非你别无选择。使用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 
    } 
}