如何从JSON响应中获取userID,而JSON文本不是以数组或对象开头,而是选项允许未设置片段

时间:2016-09-30 08:34:24

标签: ios json swift2 httpresponse

我从服务器得到了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)")
                            }
                        }
                    }

但回复是

  

无法获取userID:错误域= NSCocoaErrorDomain代码= 3840" JSON文本未以数组或对象开头,并且选项允许未设置片段。 UserInfo = {NSDebugDescription = JSON文本不以数组或对象开头,并且选项允许未设置片段。}"。

如何获得带有json响应的userID?

更新:我尝试使用anyobject,但仍然没有将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)")
                            }
                        }
                    }

4 个答案:

答案 0 :(得分:0)

你可以通过两种方式解决。

  1. 检查您的网络服务格式并将其更正为{“key”:“value”,“key”:“value”}
  2. 或者您必须将NSData转换为NSString
  3. 使用字符串(数据:,编码:.utf8)

    然后使用缩小'\'

    格式化字符串文件

    然后再次将其转换为NSData类型,然后调用JSONSerialization。

答案 1 :(得分:0)

我认为这是您收到的数据与其显示方式之间存在混淆的情况。无论是在您身边,还是在服务器端。尝试告诉我们完全服务器正在发送什么,逐字节。

你得到的是一个包含JSON的字符串。不是JSON,而是包含JSON的字符串。哪个不一样。就像一瓶啤酒不是用啤酒制成的,而是用玻璃制成的。

如果这确实是你收到的,那么你应该首先踢那些写服务器代码的人。如果这没有帮助,那么请阅读“片段”选项的作用;这将为您提供一个字符串,然后您提取字节,并将字节抛出到JSON解析器中。

答案 2 :(得分:0)

尝试使用json阅读选项中的NSJSONReadingOptions.AllowFragments

答案 3 :(得分:-1)

实际上这是NSASCIIStringEncoding。

为了获得帮助,我创建了一个程序。

请复制/粘贴并运行它。你会找到答案。

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)")
}