使用 AFNetworking 解析 JSON

Posted

技术标签:

【中文标题】使用 AFNetworking 解析 JSON【英文标题】:Parsing JSON using AFNetworking 【发布时间】:2013-12-23 19:06:09 【问题描述】:

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

我的服务正在运行。如果我将 responseObject 吐到日志中,我会得到 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);

【问题讨论】:

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

您只需要在success 块中获取 responseObject 并将其转换为数组,如下所示:

NSArray *employees = (NSArray *)responseObject;

AFNetworking 已经为您解析了 Json。您需要做的只是根据您的响应类型(可能是一个数组)转换为NSArrayNSDictionary

【讨论】:

我认为这是有道理的并尝试了一下,但出了点问题。我将 responseObject 转换为一个员工数组(就像你上面所说的那样),但这些值都是垃圾。我遍历一个循环,试图一个一个地加载我的员工,这样我就可以写出一个文件[我在上面修改了我的代码],但它每次都会崩溃。【参考方案2】:

尝试将您的运营经理的响应序列化程序设置为 [AFJSONResponseSerializer 序列化程序]

您设置了 requestSerializer,而不是 responseSerializer。 (:

myOperationManager.responseSerializer = [AFJSONResponseSerializer serializer];

【讨论】:

【参考方案3】:

这里的技巧是使用AFJSONRequestOperation,它会根据返回的 JSON 类型自动将接收到的响应转换为NSDictionaryNSArray。我将以下代码用于返回 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"

希望这会有所帮助!

更新: 似乎 AFJSONRequestOperation 已被弃用 - 我会查看 Replacement for AFJSONRequestOperation in AFNetworking 2.x 的替代方案。

【讨论】:

用户表示他们正在使用AFNetworking 2。AFJSONRequestOperation 不再可用。 AFJSONRequestOperation 在最新版本的 AFNetworking 中已弃用。那么我们可以用什么来代替 AFJSONRequestOperation @zorayr ***.com/questions/21294178/…

以上是关于使用 AFNetworking 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 解析 XML

使用 AFNetworking 2.0 异常解析 JSON

使用 AFNetworking 解析 JSON

使用 AFNetworking 解析 JSON

使用 AFNetworking 解析 JSON 文件

使用 AFNetworking 将 JSON 解析为 NSDictionary