ios - 序列化 NSDictionary 时出错

标签 ios json swift

我尝试序列化 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)")

    }
}

最佳答案

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

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 。并修复格式直至其有效。

关于ios - 序列化 NSDictionary 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579042/

相关文章:

javascript - 如何删除iOS中的Javascript插件代码?

swift - 在子类 : Swift and SpriteKit 中循环 Initialization 的 drain

json - 解开 Json Swift(发现为零)

json - package.json 版本和 teamcity

json - 我可以在 JSON Schema 中设置确切的值吗?

ios - 表格 View 单元格无法进入 numberOfRowsInSection

ios - 与 Safari 同步 - SFSafariViewController 的扩展

ios - 如何在 iOS 中获取缓冲区多边形坐标(纬度和经度)?

ios - 如何正确使用协议(protocol)来调用 GameViewController 的函数?

ios - 用户声称 iOS 应用程序导致其他 iOS 应用程序关闭?那是一回事吗?