使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块
Posted
技术标签:
【中文标题】使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块【英文标题】:Parsing and Jumping into the next block in JSON file with Swift 2.0 【发布时间】:2016-02-10 03:02:25 【问题描述】:我目前正在学习如何在 Swift 2.0 中获取和解析 JSON 文件。
这是我从朋友那里提供的示例 JSON 文件
"name": "Busitevent",
"count": 398,
"frequency": "Every 30 mins",
"version": 93,
"newdata": true,
"lastrunstatus": "success",
"thisversionstatus": "success",
"nextrun": "Wed Feb 10 2016 02:43:20 GMT+0000 (UTC)",
"thisversionrun": "Wed Feb 10 2016 02:13:19 GMT+0000 (UTC)",
"results":
"collection1": [
"eventTitles":
"href": "https://events.ucsc.edu/event/3338",
"text": "32nd Annual Martin Luther King Jr. Convocation featuring Alicia Garza"
,
"eventDates": "",
"eventDescription": "",
"index": 1,
"url": "https://events.ucsc.edu/"
我正在尝试模式匹配“collection1”,以便将其转换为对象
这是我到目前为止所得到的(将网址替换为假网址)
let url = NSURL(string: "www.jsonsourcefile.com")
let request = NSURLRequest(URL: url!)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) (response, data, error) in
//print(NSString(data: data!, encoding: NSUTF8StringEncoding))
var names = [String]()
do
let json : NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! NSDictionary
if let collection1 : NSArray = json["collection1"] as? NSArray
print("you got it")
//names.append(collection1)
catch
print("error serializing JSON: \(error)")
print(names) // ["Bloxus test", "Manila Test"]
所以我面临的主要问题是我的 if 语句不匹配 collection1,我不知道为什么。
【问题讨论】:
你试过json["results"]["collection1"]
或json["results"][0]["collection1"]
。
你提供了一个无效的 JSON,你能用一个有效的 JSON 更新吗?
尝试使用 SwiftyJSON 解析 json(一个有效的)(我发现它使处理 json 变得非常简单)
【参考方案1】:
在尝试检索 collections1
数组之前,您必须先获取 results
字典。下面提供的代码可以让您很好地理解如何在没有任何第三方解析器的情况下解析 JSON。
示例 JSON:(因为问题没有有效的 JSON)
"employees":[
"firstName":"John",
"lastName":"Doe"
,
"firstName":"Anna",
"lastName":"Smith"
,
"firstName":"Peter",
"lastName":"Jones"
]
在上面的 JSON 中,你需要注意以下几点,
它是一个对象字典employees
对象是一个字典数组
要获取firstName
的值,您必须使用嵌套的if let
块来获取数据。
var jsonString = "\"employees\":[\"firstName\":\"John\", \"lastName\":\"Doe\",\"firstName\":\"Anna\", \"lastName\":\"Smith\",\"firstName\":\"Peter\", \"lastName\":\"Jones\"]"
do
let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
let json: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! NSDictionary
if let employees = json["employees"] as? [NSDictionary]
for employee in employees
if let firstName = employee["firstName"]
print("First name ===> \(firstName)")
else
print("failure")
catch let error as NSError
print("Error while parsing data ===> \(error)")
注意:如果必须解析更大的 JSON,嵌套的 if let
s 的复杂性会更高。有第 3 方 Swift JSON 解析器(如 SwiftyJSON)可以简化您访问对象的方式。 SwiftyJSON 使用的语法类似于@kye 提到的语法。
【讨论】:
以上是关于使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块的主要内容,如果未能解决你的问题,请参考以下文章
使用 javascript 暂停 CSS 动画并跳转到动画中的特定位置