2016-11-13 10 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

これは読みにくいです。すでに最初の行で[String: AnyObject]としてdictをアンラップしましたので

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

    } 
} 

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

    } 
} 

のように書き換えることができます:私はあなたのようなあなたのコードのアップは、清掃いくつかの時間を過ごすお勧めします。 dict5は、物事を解析しようとしている場所を知るのに役立ちませんので、より分かりやすい変数名を使用してください。

この行を見て、tryステートメントがエラーの原因となっています。あなたはjsonDataとして渡しているものは何でも

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

それは、本質的に言っているが、実際のJSONではありません。 jsonlint.comのようなサイトでjsonDataが実行され、有効になるまでフォーマットを修正することをお勧めします。

関連する問題