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;
}
答案 0 :(得分:2)
我发现你来自Objective-C世界,所以首先我建议你放弃使用NSArray
,NSDictionary
等,以支持他们的Swift同行Array
和Dictionary
:
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
的每个人都将结果分配给一个不可变的常量。AnyObject
而非valueForKey
objectForKey
是一种KVC方法,不适用于此目的,使用{{1}}或密钥订阅。使用Swift原生类型根本不使用它。