如何从 JSON 响应中获取用户 ID 而 JSON 文本不是以数组或对象开头以及允许未设置片段的选项
How to get userID from JSON response while JSON text did not start with array or object and option to allow fragments not set
我收到了来自服务器的 json 响应:
"{\"userID\":\"dkjagfhaghdalgalg\"}"
我尝试通过以下方式获取该用户 ID:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) -> Void in
if let unwrappedData = data {
do {
let userIDDictionary:NSDictionary = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print("userIDDictionary:\(userIDDictionary)")
//let userID:String = userIDDictionary["userID"] as! String
//print("userID:\(userID)")
print("data:\(data)")
print("response:\(response)")
print("error:\(error)")
} catch {
print("Failed to get userID: \(error)")
}
}
}
但响应是
Failed to get userID: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set. UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}".
如何通过 json 这样的响应获取用户 ID?
更新:我尝试获取任何对象,但仍然没有获取要更改为字典的 json 字符串。
let bodyStr = "test={ \"email\" : \"\(username)\", \"password\" : \"\(password)\" }"
let myURL = NSURL(string: Constant.getSignInEmail())!
let request = NSMutableURLRequest(URL: myURL)
request.HTTPMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.HTTPBody = bodyStr.dataUsingEncoding(NSUTF8StringEncoding)!
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) -> Void in
if let unwrappedData = data {
do {
let json:AnyObject! = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! AnyObject
print("json:\(json)")
//let userID:String = userIDDictionary["userID"] as! String
//print("userID:\(userID)")
} catch {
print("Failed to get userID: \(error)")
}
}
}
有两种方法可以解决。
- 检查您的网络服务格式并将其更正为 {"key":"value","key":"value"}
- 否则您必须将 NSData 转换为 NSString。
使用String(data:, encoding:.utf8)
然后用缩减'\'格式化字符串文件
然后再次将其转换为 NSData 类型,然后调用 JSONSerialization。
我认为这是您收到的数据和它们的显示方式之间存在混淆的情况。要么在你这边,要么在服务器端。试着 确切地 告诉我们服务器正在发送什么,一个字节接一个字节。
你得到的是一个包含 JSON 的字符串。不是 JSON,而是包含 JSON 的字符串。这是不一样的。就像一瓶啤酒不是用啤酒做的,而是用玻璃做的。
如果这确实是您收到的,那么您应该首先踢掉编写服务器代码的人。如果这没有帮助,请阅读 "fragment" 选项的作用;这会给你一个字符串,然后你提取字节,并将字节放入 JSON 解析器。
实际上这是 NSASCIIStringEncoding。
为了帮助,我创建了一个程序。
请 copy/paste 和 运行 它。你会找到你的答案。
import Foundation
let string = "{\"userID\":\"dkjagfhaghdalgalg\"}"
let unwrappedData: NSData = string.dataUsingEncoding(NSASCIIStringEncoding)!
do {
let userIDDictionary:NSDictionary = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
let userid = userIDDictionary.valueForKey("userID")
print("userid:\(userid!)")
} catch {
print("Failed to get userID: \(error)")
}
尝试 json 阅读选项中的 NSJSONReadingOptions.AllowFragments
我收到了来自服务器的 json 响应:
"{\"userID\":\"dkjagfhaghdalgalg\"}"
我尝试通过以下方式获取该用户 ID:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) -> Void in
if let unwrappedData = data {
do {
let userIDDictionary:NSDictionary = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print("userIDDictionary:\(userIDDictionary)")
//let userID:String = userIDDictionary["userID"] as! String
//print("userID:\(userID)")
print("data:\(data)")
print("response:\(response)")
print("error:\(error)")
} catch {
print("Failed to get userID: \(error)")
}
}
}
但响应是
Failed to get userID: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set. UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}".
如何通过 json 这样的响应获取用户 ID?
更新:我尝试获取任何对象,但仍然没有获取要更改为字典的 json 字符串。
let bodyStr = "test={ \"email\" : \"\(username)\", \"password\" : \"\(password)\" }"
let myURL = NSURL(string: Constant.getSignInEmail())!
let request = NSMutableURLRequest(URL: myURL)
request.HTTPMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.HTTPBody = bodyStr.dataUsingEncoding(NSUTF8StringEncoding)!
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) -> Void in
if let unwrappedData = data {
do {
let json:AnyObject! = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! AnyObject
print("json:\(json)")
//let userID:String = userIDDictionary["userID"] as! String
//print("userID:\(userID)")
} catch {
print("Failed to get userID: \(error)")
}
}
}
有两种方法可以解决。
- 检查您的网络服务格式并将其更正为 {"key":"value","key":"value"}
- 否则您必须将 NSData 转换为 NSString。
使用String(data:, encoding:.utf8)
然后用缩减'\'格式化字符串文件
然后再次将其转换为 NSData 类型,然后调用 JSONSerialization。
我认为这是您收到的数据和它们的显示方式之间存在混淆的情况。要么在你这边,要么在服务器端。试着 确切地 告诉我们服务器正在发送什么,一个字节接一个字节。
你得到的是一个包含 JSON 的字符串。不是 JSON,而是包含 JSON 的字符串。这是不一样的。就像一瓶啤酒不是用啤酒做的,而是用玻璃做的。
如果这确实是您收到的,那么您应该首先踢掉编写服务器代码的人。如果这没有帮助,请阅读 "fragment" 选项的作用;这会给你一个字符串,然后你提取字节,并将字节放入 JSON 解析器。
实际上这是 NSASCIIStringEncoding。
为了帮助,我创建了一个程序。
请 copy/paste 和 运行 它。你会找到你的答案。
import Foundation
let string = "{\"userID\":\"dkjagfhaghdalgalg\"}"
let unwrappedData: NSData = string.dataUsingEncoding(NSASCIIStringEncoding)!
do {
let userIDDictionary:NSDictionary = try NSJSONSerialization.JSONObjectWithData(unwrappedData, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
let userid = userIDDictionary.valueForKey("userID")
print("userid:\(userid!)")
} catch {
print("Failed to get userID: \(error)")
}
尝试 json 阅读选项中的 NSJSONReadingOptions.AllowFragments