我正在使用像这样的AFNetworking工具来使用Web服务:
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[self GotJSONSuccess:JSON :response ];
} failure: nil ];
[operation start];
网络服务响应并给我以下json:
[
{
"statusid": 1,
"statusdesc": "ASSIGNED"
},
{
"statusid": 2,
"statusdesc": "COMPLETED"
},
{
"statusid": 3,
"statusdesc": "IN TRANSIT"
},
{
"statusid": 4,
"statusdesc": "DELAYED"
},
{
"statusid": 5,
"statusdesc": "ON HOLD"
}
]
我正在使用以下内容尝试解析json:
- (void)GotJSONSuccess: (NSString*) JSON : (NSHTTPURLResponse*) response
{
NSString *newString = [NSString stringWithFormat:@"%@",JSON];
NSLog(@"response: %@", JSON);
NSData* data = [newString dataUsingEncoding:NSUTF8StringEncoding];
NSError* error;
id jsonObjects = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (error){
NSLog(@"error is %@", [error localizedDescription]);
return;
}
NSArray *keys = [jsonObjects allKeys];
for (NSString *key in keys){
NSLog(@"%@ is %@",key, [jsonObjects objectForKey:key]);
}
}
然而,代码落入错误块并且输出为 “操作无法完成。(Cocoa error 3840。)”
我在解析这个简单的json时做错了什么?
是否有比我正在采用的更好的解析方法?
如果可能的话,我想坚持使用本机iOS类和方法进行解析。
答案 0 :(得分:4)
您可以使用NSJSONSerialization类来创建数组
NSArray *arr = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
然后对于每个状态ID,您只需索引到数组并按字母顺序提取字典:
NSDictionary *dict = [arr objectAtIndex:0];
最后一行会退出:`
{
"statusid": 1,
"statusdesc": "ASSIGNED"
}
然后你可以在字典上使用像对象一样的方法。
答案 1 :(得分:0)
如果您查看FoundationErrors.h(或只是搜索您的项目,包括链接框架,对于3840,这就是我所做的),您将看到该错误对应于NSPropertyListReadCorruptError。谷歌搜索这表明您的JSON可能无效。也许你在JSON之前或之后有额外的空格字符?您可以发布从服务器获取的URL或完整响应吗?
什么是kNilOptions?
答案 2 :(得分:0)
NSArray *array = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
NSArray *arrStatusid = [array valueForKey:@"statusid"];
使用 AFNetworking 的新版本(第二版)尝试此操作:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:req];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id response){
//data is in response
} failure:^(AFHTTPRequestOperation *operation, NSError *err){
//some code on failure
}];
[operation start];