使用AFNetworking解析JSON

使用AFNetworking解析JSON

问题描述:

我正在使用AFNetworking 2从服务器获取一些json数据。这是员工数据,我创建了一个员工对象和一个员工NSMutableArray。使用AFNetworking解析JSON

我的服务正在运行。如果我吐出响应对象的日志,我会得到600名员工。我正在努力的是如何让这些人进入我的员工NSMutableArray。

responseObject有一个id类型,意思是没有类的对象,对吗?我尝试将ID更改为员工,因为这是我想要返回的,但这并不起作用。然后我注意到responseObject实际上是所有的对象,所以我尝试了员工,但没有奏效。

所以我想我可以通过对象循环,但因为它不是一个真正的NSMutableArray,我不明白如何。

任何帮助将不胜感激。

布莱恩

- (IBAction)jsonTapped:(id)sender 
{ 

    NSMutableArray *employees; 
    employee *thisEmployee = [employee new]; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"XXXXXX" password:@"XXXXXX"]; 

    AFHTTPRequestOperation *operation = [manager GET: @"https:/XXXXXXXXXXX/something" 
              parameters: [self jsonDict] 
              success:^(

                 AFHTTPRequestOperation *operation, id responseObject) 
    { 

                 NSLog(@"Submit response data: %@", responseObject);} 
              failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
               NSLog(@"Error: %@", error);} 
                ]; 
    [operation start]; 
} 

这是我成功集团内部:

NSMutableArray *employees = (NSMutableArray *)responseObject; 

    NSLog(@"Count of array to begin: %lu", (unsigned long)[employees count]); 
    NSLog(@"JSON RESULT %@", responseObject); 

    FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]]; 
        [db open]; 
    for (employee *thisemployee in employees) { 
    BOOL success = [db executeUpdate:@"INSERT INTO employees (firstName,fullName,email) VALUES (?,?,?,?);",thisemployee.firstName,thisemployee.lastName,thisemployee.fullName,thisemployee.emailAddress, nil]; 
    if (success) {} // Only to remove success error 
    NSLog(@"DDD %@", thisemployee); 
+1

响应对象将是NSArray或NSDictionary,具体取决于指定的JSON。您需要将其转换为正确的类型才能访问数据。 –

你只需要获得responseObject的success块内,并将其转换为数组,像这样:

NSArray *employees = (NSArray *)responseObject; 

AFNetworking已经为你解析了Json。根据你的响应类型(可能是一个数组),你需要做的只是施加到NSArrayNSDictionary

+1

我认为这是有道理的,并尝试过,但有些地方是错误的。我把responseObject作为一个雇员数组(就像你上面那样),但是这些值都是垃圾。我遍历一个循环,尝试逐个加载我的员工,这样我就可以写出一个文件[我修改了上面的代码],但每次都崩溃。 –

尝试您的操作管理器的响应串设置为[AFJSONResponseSerializer串行]

你有你的requestSerializer集,而不是你responseSerializer。 (:

myOperationManager.responseSerializer = [AFJSONResponseSerializer serializer]; 

这里的技巧是使用AFJSONRequestOperation自动地转换为NSDictionaryNSArray取决于返回的JSON类型接收到的响应我用下面的代码为返回一个JSON编码的响应简单的GET请求:

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:SERVER_PATH]]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" 
                 path:@"/rank.json" 
                parameters:@{@"score" : intToString(highestScore)}]; 
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
{ 
    rankingReceived([[((NSDictionary *)JSON) objectForKey:@"rank"] intValue]); 
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
{ 
    rankingReceived(-1); 
}]; 
[operation start]; 

请求格式(GET):http://server/rank.json?score=x

响应(JSON)"{rank:y}"

希望这有助于!

UPDATE: 好像AFJSONRequestOperation已被弃用 - 我想看看Replacement for AFJSONRequestOperation in AFNetworking 2.x一种替代。

+0

用户表示他们正在使用AFNetworking 2. AFJSONRequestOperation不再可用。 – lordB8r

+0

AFJSONRequestOperation在最新版本的AFNetworking中已被弃用。所以我们可以用什么来代替AFJSONRequestOperation @zorayr – Dalvik

+0

http://stackoverflow.com/questions/21294178/replacement-for-afjsonrequestoperation-in-afnetworking-2x – Zorayr