坚持解析从服务器返回的 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_namelas_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的主要内容,如果未能解决你的问题,请参考以下文章

从 Web 服务解析 JSON 数据时,没有返回数据

json_decode 从 iOS 应用程序返回空值

使用 iOS 5 应用程序从 .Net Web 服务消费和解析 JSON 数据

iOS - AFNetworking 的 JSON 解析

如何在C#中解析/反序列化从rest服务返回的JSON

从 json 解析返回的数据排序与 json 字符串不同