将 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 中的对象数组?