为什么在 Swift 中尝试序列化 JSON 时出现错误?
Why do I get an error when trying to serializing JSON in Swift?
我刚开始学习swift。所以如果涉及到swift,我是一个菜鸟。为了尝试和实践它,我正在尝试为 ios 制作一个杂货店应用程序。但现在我可能被困在最基本的事情之一上,序列化一个 JSON 对象而不使用库,所以只使用标准 swift 代码。所以我的问题是你能帮我解决序列化我从 api.
获得的数据的问题吗?
我正在使用 postman 来检查我从 api 得到了什么样的响应。当我访问 api 时,这是我得到的响应:
[
{
"id": 1,
"name": "Regular List"
},
{
"id": 2,
"name": "List for diner"
},
{
"id": 3,
"name": "List 3"
},
{
"id": 4,
"name": "List for next week"
},
{
"id": 6,
"name": "Test name"
}
]
在我的 swift 代码中,我试图通过这样做来获得此响应:
func getBoodschapListJSON(){
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let userId = prefs.integerForKey("UserId")
let requestUrl = NSURL(string: "http://localhost:8080/api/lists/user/id/\(userId)")!
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: requestUrl)
request.HTTPMethod = "GET"
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
//Here comes some code to try and process the JSON object in the table View.
} catch {
print("error serializing JSON: \(error)")
}
}).resume()
}
但我从来没有得到有效的回应,我最终得到了错误:
"error serializing JSON: Error Domain=NSCocoaErrorDomain Code=3840 "字符 0 周围的值无效。”UserInfo={NSDebugDescription=字符 0 周围的值无效。}”
我希望它与 JSON 格式不正确有关,以便 NSJSONSerialization 能够解释它。但我不确定,我看过几个与我有相同问题的堆栈溢出帖子。他们中的大多数人说使用 .AllowFragments 但这并没有解决我的错误。
是否有人愿意帮助我,以便我能够修复我的代码中的这个错误?
你的 URL 看起来有点奇怪,但它仍然可以像那样工作。尝试在浏览器中访问 URL(为 userId 设置一个 id)并确保它看起来没问题。如果是,请确保您的 API 代码中没有 html。例如,没有元标记(您可能正在使用)。
如果这不起作用,可能是代码问题。试试我的:
let urlAsString = "http://localhost:8080/api/lists/user/id/\(userId)"
do {
let jsonDict: NSDictionary = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: urlString)!)!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print (jsonDict)
}
catch {
print ("Couldn't get JSON... \(error)")
}
使用这个简单代码得到一个 jSon 数组
let data = NSData(contentsOfURL: NSURL(string: "your URL")!)
let jsonArray: NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
之后将此数组转换为 NSDictionary 并使用其值。转换为字典的示例是
let cell = tableView.dequeueReusableCellWithIdentifier("atCell")! as UITableViewCell
let maindata = (data[indexPath.row] as! NSDictionary)
cell.textLabel?.text = maindata["date"] as? String
p.s 我使用 table 视图来显示数据...
我刚开始学习swift。所以如果涉及到swift,我是一个菜鸟。为了尝试和实践它,我正在尝试为 ios 制作一个杂货店应用程序。但现在我可能被困在最基本的事情之一上,序列化一个 JSON 对象而不使用库,所以只使用标准 swift 代码。所以我的问题是你能帮我解决序列化我从 api.
获得的数据的问题吗?我正在使用 postman 来检查我从 api 得到了什么样的响应。当我访问 api 时,这是我得到的响应:
[
{
"id": 1,
"name": "Regular List"
},
{
"id": 2,
"name": "List for diner"
},
{
"id": 3,
"name": "List 3"
},
{
"id": 4,
"name": "List for next week"
},
{
"id": 6,
"name": "Test name"
}
]
在我的 swift 代码中,我试图通过这样做来获得此响应:
func getBoodschapListJSON(){
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let userId = prefs.integerForKey("UserId")
let requestUrl = NSURL(string: "http://localhost:8080/api/lists/user/id/\(userId)")!
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: requestUrl)
request.HTTPMethod = "GET"
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
session.dataTaskWithRequest(request, completionHandler: { (data, response, error) in
do {
let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
//Here comes some code to try and process the JSON object in the table View.
} catch {
print("error serializing JSON: \(error)")
}
}).resume()
}
但我从来没有得到有效的回应,我最终得到了错误: "error serializing JSON: Error Domain=NSCocoaErrorDomain Code=3840 "字符 0 周围的值无效。”UserInfo={NSDebugDescription=字符 0 周围的值无效。}”
我希望它与 JSON 格式不正确有关,以便 NSJSONSerialization 能够解释它。但我不确定,我看过几个与我有相同问题的堆栈溢出帖子。他们中的大多数人说使用 .AllowFragments 但这并没有解决我的错误。
是否有人愿意帮助我,以便我能够修复我的代码中的这个错误?
你的 URL 看起来有点奇怪,但它仍然可以像那样工作。尝试在浏览器中访问 URL(为 userId 设置一个 id)并确保它看起来没问题。如果是,请确保您的 API 代码中没有 html。例如,没有元标记(您可能正在使用)。
如果这不起作用,可能是代码问题。试试我的:
let urlAsString = "http://localhost:8080/api/lists/user/id/\(userId)"
do {
let jsonDict: NSDictionary = try NSJSONSerialization.JSONObjectWithData(NSData(contentsOfURL: NSURL(string: urlString)!)!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print (jsonDict)
}
catch {
print ("Couldn't get JSON... \(error)")
}
使用这个简单代码得到一个 jSon 数组
let data = NSData(contentsOfURL: NSURL(string: "your URL")!)
let jsonArray: NSArray = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
之后将此数组转换为 NSDictionary 并使用其值。转换为字典的示例是
let cell = tableView.dequeueReusableCellWithIdentifier("atCell")! as UITableViewCell
let maindata = (data[indexPath.row] as! NSDictionary)
cell.textLabel?.text = maindata["date"] as? String
p.s 我使用 table 视图来显示数据...