使用 swift 2.1 遍历一个 JSON 命名的字典数组
Posted
技术标签:
【中文标题】使用 swift 2.1 遍历一个 JSON 命名的字典数组【英文标题】:Iterate through a JSON named array of dictionaries with swift 2.1 【发布时间】:2015-12-28 16:32:19 【问题描述】:我正在提取一个 JSON 字典数组,试图将它们添加到我创建的类中,并将它们用于UITableView
。 JSON 看起来像这样:
"inventory":[
"item":"item 1",
"description":"item 1 description",
"quantityOnHand":"42",
"supplier_id":"1",
"supplierName":"Supplier 1"
,
"item":"item 2",
"description":"item 2 description",
"quantityOnHand":"1001",
"supplier_id":"1",
"supplierName":"Supplier 1"
...
等等……
我在viewDidLoad()
中获取了所有这些内容,并尝试将每个字典添加到一个类(称为Inventory
)以供以后使用。这是我序列化 JSON 的地方:
override func viewDidLoad()
super.viewDidLoad()
let urlString = "my url to json data";
let session = NSURLSession.sharedSession();
let url = NSURL(string: urlString)!;
session.dataTaskWithURL(url) (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in
if let responseData = data
do
let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments)
print(json) //this prints out the above formatted json
if let dict = json as? Dictionary<String, AnyObject>
print(dict["inventory"]![0]!["description"]);
print(dict["inventory"]![0]!["item"]);
print(dict["inventory"]![0]!["quantityOnHand"]);
catch
print("Could not serialize");
.resume()
我可以使用print(dict["inventory"]![0]!["description"]);
之类的东西打印出每个值,但这似乎效率低下。
我需要一个 for 循环来计算字典的数量吗?还是for (key, value)
循环?事实上,它是一个名为inventory
的数组中的一堆字典,这真的让我很失望。如果它是 JSON 在单个字典中返回键:值对,我想我可以自己弄清楚。将json["inventory"]
放入变量后,我有点不知道该怎么做。
【问题讨论】:
【参考方案1】:首先将 JSON 序列化转换为有意义的东西,
在这种情况下Dictionary<String, AnyObject>
let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String, AnyObject>
然后检索字典数组,JSON 字符串显示它只包含String
类型。
let inventoryArray = dict["inventory"] as! [Dictionary<String, String>]
如果inventory
是可选的,则使用可选绑定
if let inventoryArray = dict["inventory"] as? [Dictionary<String, String>]
现在您可以通过简单的循环获取数组中的项目,不需要任何类型转换。
for anItem in inventoryArray
print("description:", anItem["description"])
print("item: ", anItem["item"])
print("quantityOnHand: ", anItem["quantityOnHand"])
【讨论】:
这非常有用,但我的字典必须是字符串,我的 JSON 必须是字符串吗?我假设它是从数据库传递值,它是一个 Int。我有与需要正确数据类型的 json 匹配的对象,无论是 Int 还是 String。 如果有其他值类型,如Int
,您必须将数组转换为[Dictionary<String, AnyObject>]
,并将下标项转换为特定类型,例如anItem["description"] as! String
。但是,您的示例 JSON 字符串确实只包含 String
值。
你说得对,它们是字符串。起初我没有注意到这一点。奇怪的。我将不得不检查我的 API,或者将它们快速转换。谢谢!!以上是关于使用 swift 2.1 遍历一个 JSON 命名的字典数组的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中循环遍历 Alamofire JSON 结果