将 swift 数组解析为有效的 json

Posted

技术标签:

【中文标题】将 swift 数组解析为有效的 json【英文标题】:Parsing swift arrays into valid json 【发布时间】:2017-05-05 05:45:37 【问题描述】:

所以我面临的问题是我在一个 ios 应用程序中有两个数组,我需要将它们存储在远程 mysql 数据库中,我想使用 php 和 json 来完成。然而,尽管工作了几天,我还没有设法将 ios 应用程序中的数组转换为不会使应用程序崩溃的 json 代码。数组由二维码阅读器和输入字段填充,并且每个数组中始终有相同数量的项目。目前下面的代码生成如下json:

json string = "b":"[\n\n]","p":"[\n\n]"

无论我做什么更改,应用程序似乎都会崩溃并出现以下错误: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write”,或者它说 Error Domain=NSCocoaErrorDomain Code=3840 "JSON文本没有以数组或对象开头,并且允许未设置片段的选项。” UserInfo=NSDebugDescription=JSON 文本没有以数组或对象开头,以及允许未设置片段的选项。 与我的其他一些实验(如当前下面的版本)

var productArray = [String]()
var amountArray = [String]()



func addTapped(sender: UIBarButtonItem) 
    print("Running add func")
    do 
        var test1 = ""
        var test2 = ""
        //Convert to Data
        let jsonData1 = try! JSONSerialization.data(withJSONObject: amountArray, options: JSONSerialization.WritingOptions.prettyPrinted)
        let jsonData2 = try! JSONSerialization.data(withJSONObject: productArray, options: JSONSerialization.WritingOptions.prettyPrinted)

        //Convert back to string. Usually only do this for debugging
        if let JSONString1 = String(data: jsonData1, encoding: String.Encoding.utf8) 
            print(JSONString1)
            test1 = JSONString1
        
        if let JSONString2 = String(data: jsonData2, encoding: String.Encoding.utf8) 
            print(JSONString2)
            test2 = JSONString2
        
        //In production, you usually want to try and cast as the root data structure. Here we are casting as a dictionary. If the root object is an array cast as [AnyObject].
        var json1 = try JSONSerialization.jsonObject(with: jsonData1, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject]
        var json2 = try JSONSerialization.jsonObject(with: jsonData2, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: AnyObject]






        let dict = ["json1": test1, "json2": test2] as [String: Any]


        print("All JSON should print below")
        print(dict)
        if let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 
            let url = NSURL(string: "http://www.server.com/receiver")!
            let request = NSMutableURLRequest(url: url as URL)
            request.httpMethod = "POST"
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
            request.httpBody = jsonData

            let task = URLSession.shared.dataTask(with: request as URLRequest) data,response,error in
                if error != nil
                    print(error?.localizedDescription)
                    return
                

                do 
                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

                    if let parseJSON = json 
                        let resultValue:String = parseJSON["success"] as! String;
                        print("result: \(resultValue)")
                        print(parseJSON)
                    
                 catch let error as NSError 
                    print(error)
                        
                      
            task.resume()
        


     catch 
        print("Oops")
    


【问题讨论】:

你的代码在哪一行停止了? @KKRocks 这是我的问题的一部分 - XCode 认为尽管启用了僵尸对象,但这些信息是不必要的,所以它没有告诉我。 设置异常断点并再次运行代码:***.com/a/17802868/3901620 注意到我试图做的一件事稍微破坏了代码,我在上面修复了它(只是一个小的变量名问题)。现在程序没有崩溃,而是说 Error Domain=NSCocoaErrorDomain Code=3840 “JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。” UserInfo=NSDebugDescription=JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。 如果让 jsonData = 试试? JSONSerialization.data(withJSONObject: dict, options: .allowFragments) 试试这一行 【参考方案1】:

我认为最好的解决方案是使用SwiftyJSON

不过,如果你有一个字符串,你可以使用var json = JSON.parse(yourString)

【讨论】:

以上是关于将 swift 数组解析为有效的 json的主要内容,如果未能解决你的问题,请参考以下文章

如何将 alamofire 返回 json 解析为 Swift 中的字符串数组?

如何解析 JSON 以将其转换为 Swift 中的对象数组?

如何在 Swift 中解析 JSON 数组?

Swift 和 JSON 只解析一个对象而不是一个数组

JSON .count 数组在 Swift 4 中总是返回 0

Swift JSON 解析和打印数组中的指定值