从JSON,Swift3访问对象属性

时间:2017-10-14 19:25:37

标签: json swift swift3

    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来解析来自网络的数据。我已经使用字典来访问信息,然后使用数组来获取特定密钥的数据。在这个数组中有一些对象。如何访问这些对象中的每一个'属性'值?

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;
}

2 个答案:

答案 0 :(得分:2)

我发现你来自Objective-C世界,所以首先我建议你放弃使用NSArrayNSDictionary等,以支持他们的Swift同行ArrayDictionary

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>>

答案 1 :(得分:1)

与往常一样,不要在Swift中使用[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在Swift中毫无意义。热闹的是,通过选项Any的每个人都将结果分配给一个不可变的常量。
  • Swift 3+中未指定的JSON类型为AnyObject而非valueForKey
  • objectForKey是一种KVC方法,不适用于此目的,使用{{1}}或密钥订阅。使用Swift原生类型根本不使用它。
相关问题