Ios 解码后JSON数据为零
伙计们,我收到了一个api调用的响应。它返回整个响应,我将其交给如下方法Ios 解码后JSON数据为零,ios,json,swift,swift2,Ios,Json,Swift,Swift2,伙计们,我收到了一个api调用的响应。它返回整个响应,我将其交给如下方法 completionHandler(response: response, error: nil) 然后通过做 print(response.description) 结果是我得到了标题、状态码等 URL: removed Status Code: 200 Headers: Keep-Alive: timeout=5, max=99 Content-Length: 2423 Server: Apache/2.4.1
completionHandler(response: response, error: nil)
然后通过做
print(response.description)
结果是我得到了标题、状态码等
URL:
removed
Status Code:
200
Headers:
Keep-Alive: timeout=5, max=99
Content-Length: 2423
Server: Apache/2.4.10 (Debian)
SessionID: removed
Content-Type: application/json
Date: Thu, 24 Sep 2015 12:50:14 GMT
Connection: Keep-Alive
Cache-Control: no-cache
Payload:
[{"id":148,"name":"Amsterdam","avatar":"removed","cover":"removed"}]
我最感兴趣的部分是这一部分
Payload:
[{"id":148,"name":"Amsterdam","avatar":"removed","cover":"removed"}]
不知何故,我无法提取json对象数组。谁能帮我弄到这个
编辑:添加了接收响应并将其传递的方法
func requestObj(url: Routes, params: Dictionary<String, String>?, completionHandler: (response: Response?, error: NSError?) -> ())
{
self.requestConfig(completionHandler: { () -> () in
if let req = NSMutableURLRequest(urlString: self.config!.api!.baseUrl! + "/v2" + url.rawValue) {
do {
req.addValue(String(self.config!.api!.token!), forHTTPHeaderField: "Token")
req.addValue(String(self.sessionID), forHTTPHeaderField: "SessionID")
let opt = HTTP(req)
opt.start { response in
if let err = response.error {
print("error: \(err.localizedDescription)")
print("opt finished with error info: \(response.description)")
completionHandler(response: nil, error: nil)
}
completionHandler(response: response, error: nil)
//print("data is: \(response.data)") access the response of the data with response.data
}
}
}
}) // request a valid config before doing anything
}
试试这个:
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:response options:0 error:&error];
然后,您可以执行[jsonDictionary objectForKey:@”“]
来检索值
这是目标C,但我确信它在Swift中必须类似。对于,您可以通过以下方式获得响应主体:
response.data
您是否已经尝试过使用“SwiftyJson”,您可以将数据保存在一个JSON对象中,然后将数据作为字典进行访问我是如何处理数据的
import Alamofire
import SwiftyJSON
func RequestImages()
{
Alamofire.request(.GET, "https://api.500px.com/v1/photos",parameters:["consumer_key":"gRU4LletUCA9RiOQhaJBAt62UyRRYUE6vsIcC7fO"])
.responseJSON { _,_,result in
switch result {
case .Success(let data):
let json = JSON(data)
debugPrint(data)
self.Photos = self.ParseJSON(json)
self.performSegueWithIdentifier("ToCollection", sender: self)
case .Failure(_, let error):
print("Request failed with error: \(error)")
}
}
}
下面是一些代码,我使用一个名为Alamofire的库,在这里我检索JSON中的响应,然后如果找到数据,我将数据保存在SwiftyJSON库提供的JSON对象中
let json = JSON(data)
然后我有一个名为“Photos”的“Image”模式的集合,我通过如下解析JSON数据来填充这个集合
func ParseJSON(json:JSON)->[Image]
{
//Get Image_URL
var pictures = [Image]()
for result in json["photos"].arrayValue
{
pictures.append(Image(url: result["image_url"].stringValue, name: result["name"].stringValue, news: result["description"].stringValue))
}
debugPrint(pictures)
return pictures
}
我希望我的实现能帮助你的问候 试试这个:-
override func viewDidLoad() {
super.viewDidLoad()
get_data_from_url("http://yourURL")
}
func get_data_from_url(url:String) {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
Id = label1.text //your request parameters
JId = label2.text //your request parameters
var post:NSString = "uid=\(Id)&jid=\(JId)"
//NSLog("PostData: %@",post);
var url:NSURL = NSURL(string: url)!
var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!
var postLength:NSString = String( postData.length )
var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = postData
request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("*/*", forHTTPHeaderField: "Accept")
var reponseError: NSError?
var response: NSURLResponse?
var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)
if urlData != nil && reponseError == nil {
let res = response as! NSHTTPURLResponse!;
//NSLog("Response code: %ld", res.statusCode);
if (res.statusCode >= 200 && res.statusCode < 300) {
var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
NSLog("Response ==> %@", responseData)
if Id != nil {
extract_json(urlData!)
}
} else {
var alertView:UIAlertView = UIAlertView()
alertView.title = "Sign in Failed!"
alertView.message = "Connection Failed"
alertView.delegate = self
alertView.addButtonWithTitle("OK")
alertView.show()
}
} else {
var alertView:UIAlertView = UIAlertView()
alertView.title = "Sign in Failed!"
alertView.message = "Connection Failure"
if let error = reponseError {
alertView.message = (error.localizedDescription)
}
alertView.delegate = self
alertView.addButtonWithTitle("OK")
alertView.show()
}
}
func extract_json(data:NSData) {
var error: NSError?
let jsonData:NSArray = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as! NSArray
let Id_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["id"]
let Name_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["name"]
}
响应的类型是什么?它不包含表示响应体的属性吗?您应该在响应数据变量中获取JSON数据。请粘贴更多的代码,以便问题变得更清楚。对于NSURLConnection,您可以在连接委托方法didReceiveData:.@EricD中获得响应数据。响应类型为response。属性是(我假设)“有效负载:”对吗?我不知道任何响应
类型。是从图书馆来的吗?它是代码中其他地方的自定义类型吗?它来自哪里?啊,是的,对不起,我正在使用库为我处理http请求@埃里克。这基本上是一个http响应。我通过返回response.data尝试了这一点,但结果为零:/@Reshad您是否检查了error
引用是否有值?@CraigOtis是的。我用新的Do{}Catch{}块进行了尝试,但没有输入错误。取而代之的是,它打印了Do的值,但它是nill。你可以打印你得到的标题吗?也尝试过这个。当我返回时,它返回NSData。然后我想将它作为JSON保存在一个领域对象(参见realm.io)中,而不是为SwiftHTTP创建的JSONJoy对象。这就是问题所在。您的问题是如何从响应对象获取数据。我相信我已经回答了这个问题。现在,如果您有一个新的请求,比如如何从数据中获取json对象,然后使用Realm保存它,这将是一个完全不同的问题怎么会。。当我将{let jsonResult=try NSJSONSerialization.JSONObjectWithData(响应,选项:NSJSONReadingOptions.MutableContainers)作为?NSDictionary print(jsonResult)}捕获let error作为NSError{print(error)}时,我得到了零?(即使没有使用领域或任何东西)我告诉过你使用response.data
,但你仍然在使用response
,这是你的错误。不,我更改了我的方法以返回response.data completionHandler(response:response.data,error:nil),它是NSData作为该方法的返回值。所以这部分的响应是NSData
override func viewDidLoad() {
super.viewDidLoad()
get_data_from_url("http://yourURL")
}
func get_data_from_url(url:String) {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
Id = label1.text //your request parameters
JId = label2.text //your request parameters
var post:NSString = "uid=\(Id)&jid=\(JId)"
//NSLog("PostData: %@",post);
var url:NSURL = NSURL(string: url)!
var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!
var postLength:NSString = String( postData.length )
var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.HTTPBody = postData
request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("*/*", forHTTPHeaderField: "Accept")
var reponseError: NSError?
var response: NSURLResponse?
var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)
if urlData != nil && reponseError == nil {
let res = response as! NSHTTPURLResponse!;
//NSLog("Response code: %ld", res.statusCode);
if (res.statusCode >= 200 && res.statusCode < 300) {
var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
NSLog("Response ==> %@", responseData)
if Id != nil {
extract_json(urlData!)
}
} else {
var alertView:UIAlertView = UIAlertView()
alertView.title = "Sign in Failed!"
alertView.message = "Connection Failed"
alertView.delegate = self
alertView.addButtonWithTitle("OK")
alertView.show()
}
} else {
var alertView:UIAlertView = UIAlertView()
alertView.title = "Sign in Failed!"
alertView.message = "Connection Failure"
if let error = reponseError {
alertView.message = (error.localizedDescription)
}
alertView.delegate = self
alertView.addButtonWithTitle("OK")
alertView.show()
}
}
func extract_json(data:NSData) {
var error: NSError?
let jsonData:NSArray = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as! NSArray
let Id_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["id"]
let Name_temp: AnyObject? = ((jsonData)[0] as! NSDictionary)["name"]
}
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("*/*", forHTTPHeaderField: "Accept")