2016-11-13 59 views
0

我试图序列化一个NSDictionary,并且得到以下错误:数据无法被读取,因为它的格式不正确。序列化NSDictionary错误

这是我尝试序列化的一小部分对象。它的格式相同,我刚刚删除了大部分的项目。

{ 
    action = Websites; 
    method = "school_webpage"; 
    result =  { 
     CurrentStatus = 1; 
     Description = OK; 
     ReturnValue =   { 
      bgcolor = "#FFFFFF"; 
      splash = ""; 
      tree =    (
           { 
        children =      (
               { 
          iconCls = "icn-add"; 
          id = 462793; 
          leaf = 1; 
          showAdd = 0; 
          text = "Ahrens, Linda"; 
          type = website; 
         }, 
               { 
          iconCls = "icn-add"; 
          id = 498858; 
          leaf = 1; 
          showAdd = 0; 
          text = "Altemose, David"; 
          type = website; 
         }, 
               { 
          iconCls = "icn-add"; 
          id = 11159347; 
          leaf = 1; 
          showAdd = 0; 
          text = "Alvin, Patrick"; 
          type = website; 
         } 
} 

我的代码如下。这个NSDictionary是作为一个AnyObject传递的

func parseJson(_ JsonDict: AnyObject) 
{ 
    print(JsonDict) 
    var data = [newsarticle]() 
    do{ 
     let jsonData = NSKeyedArchiver.archivedData(withRootObject: JsonDict) 
      let jsonObject = try JSONSerialization.jsonObject(with: jsonData,  options: JSONSerialization.ReadingOptions.mutableContainers) 

      if let dict = jsonObject as? [String: AnyObject] 
      { 
       if let dict2 = (dict as? [String : AnyObject])?["result"]?["ReturnValue"]{ 

        if let dict3 = (dict2 as! [String: AnyObject])["tree"] as? [AnyObject] { 

         for dict4 in dict3 { 
          if let dict5 = dict4["children"] as? [AnyObject]{ 
           for dict6 in dict5{ 
            data.append(newsarticle(name: ((dict6 as? [String : AnyObject])?["text"])! as! String,desc: "https://www.oncoursesystems.com/school/webpage/\((dict6 as? [String : AnyObject])?["id"])/689493")) 
           } 

          } 
         } 
         addData(data) 
        } 
       } 


      } 


     } 

    catch let error as NSError { 
     print("Failed to load: \(error.localizedDescription)") 

    } 
} 

回答

0

这很难读。我建议你花一些时间清理你的代码了,如:

if let dict = jsonObject as? [String: AnyObject] { 
    if let dict2 = (dict as? [String : AnyObject])?["result"]?["ReturnValue"] { 

    } 
} 

可以改写为:

if let dict = jsonObject as? [String: AnyObject] { 
    if let returnValue = dict["result"]?["ReturnValue"] { 

    } 
} 

因为你已经解开dict作为第一线[String: AnyObject]。并使用更多的描述性变量名称,因为dict5无法帮助您知道您尝试解析事物的位置。

所以看看这一行,try声明是什么导致你的错误。

let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.mutableContainers) 

这实际上是说,无论你通过为jsonData是不是真正的json。我建议你通过jsonlint.com之类的网站运行任何jsonData,然后修正格式,直到它有效。