无法从服务器 api 解析 JSON
Posted
技术标签:
【中文标题】无法从服务器 api 解析 JSON【英文标题】:Unable to parse JSON from server api 【发布时间】:2017-04-05 06:56:32 【问题描述】:我正在使用AFNetworking
通过以下代码从服务器获取 post api 响应
void (^AuthLoginCompleteBlock)(BOOL success, NSString *message, NSDictionary *response, NSError *error);
-(void)login:(NSString *)user password:(NSString *)password deviceID:(NSString *)deviceID callback:(authRequestCompleteBlock)callback
AuthLoginCompleteBlock = callback;
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:user,@"data[User][username]]",password,@"data[User][password]]",deviceID,@"data[User][device_id]]", nil];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
[manager POST:[NSString stringWithFormat:@"%@/%@",SERVER_URL,LOGIN] parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
NSString *str = [NSString stringWithFormat:@"%@",responseObject];
AuthLoginCompleteBlock(YES,str,nil,nil);
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
AuthLoginCompleteBlock(NO,error.description,nil,nil);
];
NSLog(@"param = %@",parameters);
现在 URL 工作正常,一切似乎都很好,但问题是响应来自我在 AuthLoginCompleteBlock
块中创建的 message
字符串,NSDictionary
响应来自 NULL
,看起来像这样(消息字符串)
message = "Please enter valid email related to your account.";
status = failed;
在尝试这样获取时
NSData *jsonData = [message dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
id json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
if(!error)
NSLog(@"hello = %@", json);
else
NSLog(@"errr = %@",error.description);
出现以下错误
错误域=NSCocoaErrorDomain 代码=3840“字符 6 周围的对象中的值没有字符串键。” UserInfo=NSDebugDescription=在字符 6 附近的对象中没有值的字符串键。这意味着来自服务器的 Json 格式不正确?但是在邮递员中,响应如下并且非常好
"status": "failed",
"message": "Please enter valid email related to your account."
如果我遗漏了什么,请发表评论。
【问题讨论】:
【参考方案1】:问题是我已经得到了一个字典,所以我不需要解析它。错误是这两行。
NSString *str = [NSString stringWithFormat:@"%@",responseObject];
AuthLoginCompleteBlock(YES,str,nil,nil);
我正在向已经是字典的块发送字符串。
【讨论】:
【参考方案2】:AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
NSDictionary *parameters = @
@"user": @"login",
@"password": txtFieldPassword.text,
@"device": @"ios",
@"deviceToken": strToken,
;
NSLog(@"parameters is ====%@",parameters);
manager.responseSerializer = [AFJSONResponseSerializer
serializerWithReadingOptions:NSJSONReadingAllowFragments];
[manager POST:@"yourUrl" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
NSLog(@"success!%@",responseObject);
[self successfullLogin:responseObject];
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
NSLog(@"error: %@", error);
];
【讨论】:
好像AFNetworking 3.0没有AFHTTPRequestOperationManager。 是的 AFHTTPRequestOperationManager 不包含在 pod AFNetworking 3.0 中以上是关于无法从服务器 api 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章