Ios 从Alamofire响应访问JSON值

Ios 从Alamofire响应访问JSON值,ios,json,swift,Ios,Json,Swift,我向本地服务器发出请求,返回以下JSON: {“会话密钥”:“somecodexyz1234”} 以下代码用于尝试打印session\u键值。但这总是被计算为nil` Alamofire.request(url, method: .post, parameters: parameters).responseJSON(completionHandler: { response in print("Request: \(String(describing: response.request))")

我向本地服务器发出请求,返回以下JSON:

{“会话密钥”:“somecodexyz1234”}

以下代码用于尝试打印
session\u键值。但这总是被计算为
nil`

Alamofire.request(url, method: .post, parameters: parameters).responseJSON(completionHandler: {
response in
print("Request: \(String(describing: response.request))")
print("Response: \(String(describing: response.response))")

print("Response code: \(String(describing: response.response?.statusCode))")


if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
    print("Data: \(utf8Text)") // original server data as UTF8 string
}}

if response.data  != nil {
    let json = JSON(data: response.data!)

    // changes 
    if let arr : NSArray = json as? NSArray
    {
          let sk = arr.value(forKey: "session_key") as? String
          if sk != nil {print(sk)}
    }
}
以下是输出(打印(sk)由于为零而不执行):

请求:可选(http://127.0.0.1:5000/code)
响应:可选({URL:http://127.0.0.1:5000/code }{状态代码:200,标题{
“内容长度”=40;
“内容类型”=“应用程序/json”;
日期=“2017年9月23日星期六06:02:25 GMT”;
Server=“Werkzeug/0.12.2 Python/3.4.3”;
} })
响应代码:可选(200)
数据:“{\”会话\密钥:\“somecodexyz1234\”}

使用下面的代码以json格式从almofire获取响应。在代码中,您直接检查response.data,而不是第一次检查response.result,如下所示

Alamofire.request(requestURL, method:.post, parameters: param as? Parameters, encoding: URLEncoding(destination: .httpBody), headers: headers).responseJSON(completionHandler: { (response) in
            switch response.result
            {
            case .success(let responseJSON):
                // If request success then you will get response in json here
                if responseJSON is String{
                    print("Reponse is string")
                }
                else if responseJSON is NSDictionary{
                    print("Reponse is Dictionary")
                }
                else if responseJSON is NSArray{
                    print("Reponse is Array")
                }
                else{
                    print("Any object")
                    return
                }
                print("Response : \((dicResponse)")

                break
            case .failure(let error):
                // If request is failure then got error here.
                break
            }
        })

使用下面的代码从json中的almofire获取响应。在代码中,您直接检查response.data,而不是第一次检查response.result,如下所示

Alamofire.request(requestURL, method:.post, parameters: param as? Parameters, encoding: URLEncoding(destination: .httpBody), headers: headers).responseJSON(completionHandler: { (response) in
            switch response.result
            {
            case .success(let responseJSON):
                // If request success then you will get response in json here
                if responseJSON is String{
                    print("Reponse is string")
                }
                else if responseJSON is NSDictionary{
                    print("Reponse is Dictionary")
                }
                else if responseJSON is NSArray{
                    print("Reponse is Array")
                }
                else{
                    print("Any object")
                    return
                }
                print("Response : \((dicResponse)")

                break
            case .failure(let error):
                // If request is failure then got error here.
                break
            }
        })

您使用的是SwiftyJSON,那么为什么再次将
让arr:NSArray=json转换为?NSArray
像这样。你可以这样做

Alamofire.request(url, method: .post, parameters: parameters).responseJSON(completionHandler: {
            response in
            print("Request: \(String(describing: response.request))")
            print("Response: \(String(describing: response.response))")

            print("Response code: \(String(describing: response.response?.statusCode))")

            if response.result.isSuccess, let result = response.result.value {
                let json = JSON(result)

                // Here is your session key
                let sk = json["session_key"].stringValue

            } else {
                //Failure
            }
        })

您使用的是SwiftyJSON,那么为什么再次将
让arr:NSArray=json转换为?NSArray
像这样。你可以这样做

Alamofire.request(url, method: .post, parameters: parameters).responseJSON(completionHandler: {
            response in
            print("Request: \(String(describing: response.request))")
            print("Response: \(String(describing: response.response))")

            print("Response code: \(String(describing: response.response?.statusCode))")

            if response.result.isSuccess, let result = response.result.value {
                let json = JSON(result)

                // Here is your session key
                let sk = json["session_key"].stringValue

            } else {
                //Failure
            }
        })


测试此代码时,始终执行else语句,而从不执行dicsresponse语句printed@hiren检查他的回答进入NSarray而不是字典,因此将NSarray改为NSDictionary@Anon957检查响应的类型。你得到的是数组还是字典?正如你在问题中提到的,你的回答看起来像一本字典。@Hiren我正在买一本字典。我的服务器非常简单,运行Python Flask。这是返回响应的代码:
result='{“session_key”:“somecodexyz1234”}返回jsonify(result),200
@Anon检查响应对象的类型。我认为您从保护键盘返回的字符串就是这样得到的。测试此代码时,始终执行else语句,而从不执行响应printed@hiren检查他的回答进入NSarray而不是字典,因此将NSarray改为NSDictionary@Anon957检查响应的类型。你得到的是数组还是字典?正如你在问题中提到的,你的回答看起来像一本字典。@Hiren我正在买一本字典。我的服务器非常简单,运行Python Flask。这是返回响应的代码:
result='{“session_key”:“somecodexyz1234”}返回jsonify(result),200
@Anon检查响应对象的类型。我想你们得到的字符串是从guard键盘返回的。guard let dicResponse=responseJSON as?NSArray else{return}将此添加到您的response@HimanshuMoradiya我尝试将代码更改为使用
NSArray
,但在执行else语句时,这仍然不起作用。<代码> RejsJSON <代码>的值:在守护程序之前:<代码> {“SSESTONSY键”:“SoeCooDeXZ1234”} /代码>不使用基础类:使用数组而不是NSARTAL。“(打印(sk)不执行,因为它是零)”不应该执行它,因为您的代码没有通过if let。。。作为阵列测试。您的JSON是一个字典,而不是一个数组。@Larme使用
NSDictionary
也不起作用
else
子句仍在执行,因为
代码不传递if let as NSDictionary
JSON
对象的类是什么?guard let dicsponse=responseJSON as?NSArray else{return}将此添加到您的response@HimanshuMoradiya我尝试将代码更改为使用
NSArray
,但在执行else语句时,这仍然不起作用。<代码> RejsJSON <代码>的值:在守护程序之前:<代码> {“SSESTONSY键”:“SoeCooDeXZ1234”} /代码>不使用基础类:使用数组而不是NSARTAL。“(打印(sk)不执行,因为它是零)”不应该执行它,因为您的代码没有通过if let。。。作为阵列测试。您的JSON是一个字典,而不是一个数组。@Larme使用
NSDictionary
也不起作用
else
子句仍在执行,因为
代码没有传递if let as NSDictionary
以及
JSON
对象的类是什么?很遗憾,这不起作用。如果我打印
json
我会得到
{“session_key”:“somecodexyz1234”}
但是当我打印
session_key
我会得到一个空行…@Anon957是的,因为你的json格式不同。我的答案只是一个例子。您可以按照您的响应格式获取。很遗憾,这不起作用。如果我打印
json
我会得到
{“session_key”:“somecodexyz1234”}
但是当我打印
session_key
我会得到一个空行…@Anon957是的,因为你的json格式不同。我的答案只是一个例子。您可以按照您的响应格式获取