坚持解析从服务器返回的 JSON,ios
Posted
技术标签:
【中文标题】坚持解析从服务器返回的 JSON,ios【英文标题】:stuck to parse a JSON returned from server, ios 【发布时间】:2012-09-17 20:41:21 【问题描述】:我正在使用下面的 AFNetworking 进行身份验证
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
// Parsing will be here
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
NSLog(@"ERROR :jason is %@",JSON);
];
[client enqueueHTTPRequestOperation:operation];
以下是从服务器接收到的 JSON
"first_name" = A;
"last_name" = B;
问题: 如何在 ios 中解析这个 JSON。我被卡住了,因为服务器的返回根本没有任何标签。如果它的格式是
"user":
"first_name": "A",
"last_name": "B",
我可以通过以下方式进行解析
NSArray *userList = [[NSArray alloc] init];
userList = [JSON objectForKey:@"results"];
有什么想法吗?
【问题讨论】:
好吧,你的第一个 JSON 序列是错误的。但我想知道您打印的内容是否是 NSDictionary.description 的输出,而不是实际的 JSON。而且我不知道您所说的“标签”是什么意思—— "X" : "Y"
是完全有效的 JSON(5
也是如此)。
请注意,您的代码 sn-p 不会“解析”任何内容。大概JSON
是 JSON 字符串的解析结果,在上述两种情况下,它都是一个 NSDictionary。
第一个是实际的 JSON。我正在使用 Chrome 中的Postman
,结果是这样返回的。我所说的标签是对象的名称。因此,在第二个 JSON 中,它是 user
。我同意我没有解析,因为给定一个 NSDictionary
,我不知道如何将它变成一个数组......因为它没有密钥(比如第二个有一个名为user
的键,这样我就可以通过objectForKey
返回一个数组...
【参考方案1】:
“标签”不在terminology of JSON 中。 JSON 的复杂结构在发送者和接收者之间协商(或简单地由发送者指定),不需要遵循任何特定的大纲,只要它正确解析即可。
您引用的第一个 quasi-JSON 字符串(如果它是有效的 JSON)可能会识别个人的名字和姓氏,并且您可能会知道它是“用户”身份,以及它识别的用户,从上下文。
通常,您必须将 JSON 字符串视为洋葱,一次剥一层。在您的第一个字符串的情况下,只有一个层,一个映射到 NSDictionary 的“对象”。因此,在收到对象后(并且,如有必要,使用isKindOfClass
验证它确实是一个 NSDictionary,您可以将id
值转换为NSDictionary
并继续使用objectForKey
或类似的东西来访问内的值。
【讨论】:
您将 JSON 视为洋葱的方式是正确的。我只是试了一下,以便检索first_name
和las_name
。感谢您的帮助【参考方案2】:
您应该利用 iOS5 中提供的新 JSONSerialization 类,它使 JSON 易于使用。下面是一个快速示例,它获取您的 json 并在 fetchedData 方法中对其进行解析。下面列出的资源
//CALL dataWithContentsOfURL ONCE DATA HAS BEEN RECEIVED YOU CAN PARSE THE JSON:
NSError *error = nil;
NSData* data = [NSData dataWithContentsOfURL:kURL options:NSDataReadingUncached error:&error];
if (error)
NSLog(@"%@", [error localizedDescription]);
else
NSLog(@"Data has loaded successfully.");
//MORE CODE HERE?
- (void)fetchedData:(NSData *)responseData
_yourObjectArray = [[NSMutableArray alloc] init];
//parse out the json data
NSError* error;
NSArray* json = [NSJSONSerialization JSONObjectWithData:responseData //1
options:kNilOptions
error:&error];
for(int i=0; i<[json count]; i++)
YourObject *yObject = [[YourObject alloc]init];
NSDictionary* rawData = [json objectAtIndex:i]; //2
yObject.FirstName = [rawData objectForKey:@"first_name"];
yObject.LastName = [rawData objectForKey:@"last_name"];
[_yourObjectArray addObject:yObject];
来源: http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html http://www.raywenderlich.com/5492/working-with-json-in-ios-5
【讨论】:
抱歉,如果您查看 OP 中的第一个 JSON,则根本没有那种对象的标签。这就是我被卡住的原因.....以上是关于坚持解析从服务器返回的 JSON,ios的主要内容,如果未能解决你的问题,请参考以下文章