2017-10-14 130 views
0
let url = URL(string: "http://192.168.30.243:5000/trippy/destination/info?id=4864cc0a-8") 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     if error != nil { 
      print ("ERROR") 
     } 
     else { 
      if let content = data { 
       do { 
        //Array 
        let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
        print(myJson) 

        if let information = myJson as? NSDictionary { 
         print (information.value(forKey: "EmergencyNumbers")!) 
         if let number = information.value(forKey: "EmergencyNumbers") as? NSArray { 

//This is the part I am unsure about 

          if let description = number[0] as? AnyObject { 
           //I know do not know how to access the object's attribute values 

          } 
         } 
        } 
       } 
       catch { 

       } 
      } 
     } 
    } 
    task.resume() 

} 

我已经使用JSON解析来自Web的数据。我利用字典访问信息,然后使用数组从特定键获取数据。在这个数组中有一些对象。我如何访问这些对象的每个属性值?从JSON访问对象属性Swift3

JSON实例:

{ 
    Currency = testCurrency; 
    DestinationId = "4864cc0a-8"; 
    DialCode = testDialCode; 
    DoesntUseMetricSystem = 0; 
    DrinkingAge = 16; 
    DriverLicense = 1; 
    EmergencyNumbers =  (
       { 
      Description = "Emergency Pizza Delivery"; 
      Id = 1; 
      Number = 6969; 
     } 
    ); 
    Id = 1; 
    IsNorthHemisphere = 1; 
    OfficialLanguage =  { 
     Id = 1; 
     Name = testLanguage; 
    }; 
    PowerGridVoltage = 226; 
    PowerSocket = dk; 
    Telecoms = nonern; 
    Tipping = 2; 
    WidelySpokenLanguages =  (
       { 
      Id = 2; 
      Name = testtLanguage; 
     } 
    ); 
    WrongSideOfRoad = 0; 
} 
+1

json是什么样的? – ozgur

+1

您能否提供您试图解析的JSON示例响应 –

+0

我也推荐使用Alamofire(https://github.com/Alamofire/Alamofire)来发出请求并使用swiftyjson(https:// github。 com/SwiftyJSON/SwiftyJSON)解析JSON –

回答

2

我看你是从Objective-C的世界即将到来,所以首先我建议你放弃了有利于他们的斯威夫特同行ArrayDictionary使用NSArrayNSDictionary等:

let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
    ... 
    let JSON = try? JSONSerialization.jsonObject(with: data!, options: []) 
    if let dictionary = JSON as? [String: Any], 
    let emergencyNumbers = dictionary["EmergencyNumbers"] as? [[String: Any]] 
    { 
    emergencyNumbers.forEach { numbers in 
     print(numbers["Description"] as? String) 
     print(numbers["Id"] as? Int) 
     print(numbers["Number"] as? Int) 
    } 
    } 
} 

通过[String: Any]只是Dictionary<String, Any>的语法糖。同样适用于阵列:[[String: Any]]适用于Array<Dictionary<String, Any>>

+2

记住NS表示不是Swift;) – iLandes

1

与往常一样,不要在斯威夫特使用NSArray/NSDictionary。你扔掉类型信息。

根对象是一个字典([String:Any]),键EmergencyNumbers的值是一个数组([[String:Any]])。使用循环遍历数组。

if let root = try JSONSerialization.jsonObject(with: content) as? [String:Any] { 
    print(myJson) 

    if let emergencyNumbers = root["EmergencyNumbers"] as? [[String:Any]] { 
     for emergencyNumber in emergencyNumbers { 
      let description = emergencyNumber["Description"] as? String 
      let id = emergencyNumber["Id"] as? Int 
      let number = emergencyNumber["Number"] as? Int 

      print("description", description ?? "n/a") 
      print("id", id ?? "n/a") 
      print("number", number ?? "n/a") 
     } 
} 

其他一些不良的生活习惯:

  • .mutableContainers是斯威夫特完全没有意义。有趣的是,每个通过选项.mutableContainers的人都将结果赋给一个不变的常量。
  • 斯威夫特3+未指定的JSON类型AnyAnyObject
  • valueForKey,一个KVC方法,不适合此目的,使用objectForKey或关键订阅。使用Swift本地类型根本不使用它。