如何从 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)")
                            }
                        }
                    }

有两种方法可以解决。

  1. 检查您的网络服务格式并将其更正为 {"key":"value","key":"value"}
  2. 否则您必须将 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