嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃
Posted
技术标签:
【中文标题】嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃【英文标题】:Nested JSON data will cause crash using NS Dictionary (in Swift) 【发布时间】:2014-06-20 12:08:18 【问题描述】:我正在尝试使用 Swift 中的 JSONSerialization 以 JSON 格式获取电影信息并将其保存为 NSDictionary。但是,调用 Rotten Tomatoes API(其中嵌套了信息)会导致我的 Playground 崩溃(不会给我任何有用的错误)。
我知道代码有些有效,因为调用其他不嵌套其数据的 API 可以工作(但不能满足我的需要)。
代码如下:
func getJSON(urlToRequest: String) -> NSDictionary
var url = NSURL(string: urlToRequest)
var error: NSError?
let jsonData: NSData = NSData.dataWithContentsOfURL(url , options: NSDataReadingOptions.DataReadingMapped, error: nil)
let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
return jsonDict
let movieData: NSDictionary = getJSON(apiURL)
这是来自 Rotten Tomatoes API JSON 的示例(为了便于说明而缩短,这是实际的 JSON 文件,而不是我的代码的输出)
"id": 770672122,
"title": "Toy Story 3",
"year": 2010,
"genres": ["Animation", "Kids & Family", "Science Fiction & Fantasy", "Comedy"],
"release_dates":
"theater": "2010-06-18",
"dvd": "2010-11-02"
,
"ratings":
"critics_rating": "Certified Fresh",
"critics_score": 99,
"audience_rating": "Upright",
"audience_score": 89
【问题讨论】:
它是否可能包裹在数组[]
中?请提供“烂番茄”的有效网址。
@Zaph 我不能给你一个 URL,因为它包含我唯一的 API 密钥,但是如果你去这里,你会看到来自不同类型请求的示例输出 developer.rottentomatoes.com/docs - 你怎么看它们就是当我请求它们时它们的显示方式(至少根据我的浏览器,因为我不能在 Xcode 上这样做)
您从应用程序中的NSLog()
发布的代码是来自烂番茄网站的复制/粘贴吗?
@Zaph 从该站点复制 - 一旦我尝试在上面的代码中输入一个烂番茄 URL,它就会崩溃,因此无法获取日志。请注意,在我的浏览器上输入 URL 会返回与 RT 网站显示的完全相同的内容(减去格式)
【参考方案1】:
这段代码适用于我的 Swift ios 应用程序(在操场上运行时 Xcode 崩溃:
func getJSON(urlToRequest: String) -> NSDictionary
var url = NSURL(string: urlToRequest)
var error: NSError?
let jsonData: NSData = NSData.dataWithContentsOfURL(url , options: NSDataReadingOptions.DataReadingMapped, error: nil)
let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
return jsonDict
let apiURL = "http://api.rottentomatoes.com/api/public/v1.0/movies/770672122.json?apikey=9p4xwzpgt8xp2vahnyx2sc6g"
let movieData: NSDictionary = getJSON(apiURL)
println(movieData)
看起来您遇到的崩溃是操场错误。
注意,Swift 基本上保证有 bug,它是早期的 Beta。
还明确声明 JSON 是示例代码,而不是运行您的代码。
【讨论】:
我创建了一个临时 API 密钥供您查看 - 这是一个有效的示例 URL api.rottentomatoes.com/api/public/v1.0/movies/… 我尝试运行 Charles,它报告成功访问,所以我认为服务器很好 - 让我知道你认为问题可能是什么。非常感谢您的帮助。 看看我的 Playground,它似乎可以正常运行 fetch 和 jsonData 部分,并在尝试处理 jsonDict 部分时崩溃 - 因此我认为这是一个 JSON 错误 非常感谢!我想我不应该对操场过于信任 - 我会编辑问题以使其更清晰 现在 Playground 似乎在显示嵌套的 NSDictionary 和 NSArray 方面存在多个问题。基本上来说,无论你输入什么,它都不应该崩溃:)以上是关于嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃的主要内容,如果未能解决你的问题,请参考以下文章
PHP json_encode() 与空 NSDictionary
将字典嵌套到 JSON 以用于 POST 请求 Python
python读取json格式文件大量数据,以及python字典和列表嵌套用法详解