嵌套的 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

从字典列表中创建嵌套的 json 对象

python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

将带有嵌套字典的json响应转换为pandas数据框[重复]