使用NSJSONSerialization解析错误

时间:2015-10-28 11:24:27

标签: json swift nsjsonserialization

我在尝试从URL解析JSON时遇到错误。

以下是代码:

      override func viewDidLoad() {  
      super.viewDidLoad()  
        print("hello")  
        let url=NSURL(string:"http://jsonReports/sample_testkrtk252.json")  
        print("hello2")  

        if let allContactsData=NSData(contentsOfURL:url!)  

        {  
            print(allContactsData)  
        do{  
       let allContacts: AnyObject! = try NSJSONSerialization.JSONObjectWithData(allContactsData, options: NSJSONReadingOptions.MutableContainers)  
            print(allContacts)  
            if let json = allContacts as? Array<AnyObject> {  

                print(json)  
                for index in 0...json.count-1 {  

                    let data12 : AnyObject? = json[index]  
                    print(data12)  

                    let collection = data12! as! Dictionary<String, AnyObject>  
                    print(collection)  

                    print(collection["data11"])  

                    let data11 : AnyObject? = collection["data11"]  
                    let cont : AnyObject? = collection["cont"]  

                    data1.append(data11 as! String)  
                    data2.append(cont as! String)  

                    print(data1)  
                    print(data2)  
                }  
            }  
        }  
        catch  
        {  
            print("error")  
        }  
        }  

成功运行后,它会给出以下输出:

  

您好
  hello2
  &lt; 7b0d0a20 20202022 ...&gt;
  错误
  (lldb)

另外,它给出了错误:

  

NSError域:“NSCocoaErrorDomain” - 代码:3840 0x00007f8b62c9ef50 _userInfo __NSDictionaryI * 1键/值对0x00007f8b62dcb3c0

如果有人可以调查一下这将是很好的。另外,有没有更好的方法来解析Swift中的JSON?

3 个答案:

答案 0 :(得分:0)

为什么不直接将AnyObject返回JSONObjectWithData转换为NSDictionary数组?像这样:

let allContacts = try NSJSONSerialization.JSONObjectWithData(allContactsData, options: NSJSONReadingOptions.MutableContainers) as! [NSDictionary]

您确定您的JSON有效吗?斯威夫特对此非常敏感。确保所有键都被引用,你没有忘记任何大括号(特别是最外面的大括号)。

对于JSON解析,我建议SwiftyJSON使事情变得更容易。

答案 1 :(得分:0)

您的文件.json不是有效的结构。删除第一行:

"registration_id":APA91bEVsOgzkFFDCuEFn8PAS-FQqeaW6TRuz09CeKSnAJUSJmTvP8ubIsUkUe2zOzz8vk-FNqbNteOcD6m8m5nhrNWA96swZHYyX4nvY-mPCJTeBkEXTLuLwWCglbAUVCqJlwharLLJ,

现在尝试运行代码:

 func run()->(Void){
        //insert you file .jso into project. Or change the code
        let filePath  = NSBundle.mainBundle().pathForResource("sample_testkrtk252", ofType:"json")
        let nsMutData:NSData = NSData(contentsOfFile:filePath!)!
        do{  
            let allContacts:[String:AnyObject] =  try NSJSONSerialization.JSONObjectWithData(nsMutData, options: NSJSONReadingOptions.MutableContainers) as! [String : AnyObject]
            print(allContacts)

            for temp in 0...allContacts.count-1 {

                print(temp)
            }

        } catch
        {
            print("error")

        }
    }

答案 2 :(得分:0)

感谢您的回答。 只是编辑json为我工作。 是的,确实需要正确地遵循格式,否则简单的双引号可能会破坏预期的输出。 :)

"registration_id":"APA91bEVsOgzkFFDCuEFn8PAS-FQqeaW6TRuz09CeKSnAJUSJmTvP8ubIsUkUe2zOzz8vk-FNqbNteOcD6m8m5nhrNWA96swZHYyX4nvY-mPCJTeBkEXTLuLwWCglbAUVCqJlwharLLJ",

谢谢, Poulami