使用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);
你只需要获得responseObject的success
块内,并将其转换为数组,像这样:
NSArray *employees = (NSArray *)responseObject;
AFNetworking已经为你解析了Json。根据你的响应类型(可能是一个数组),你需要做的只是施加到NSArray
或NSDictionary
。
我认为这是有道理的,并尝试过,但有些地方是错误的。我把responseObject作为一个雇员数组(就像你上面那样),但是这些值都是垃圾。我遍历一个循环,尝试逐个加载我的员工,这样我就可以写出一个文件[我修改了上面的代码],但每次都崩溃。 –
尝试您的操作管理器的响应串设置为[AFJSONResponseSerializer串行]
你有你的requestSerializer集,而不是你responseSerializer。 (:
myOperationManager.responseSerializer = [AFJSONResponseSerializer serializer];
这里的技巧是使用AFJSONRequestOperation
自动地转换为NSDictionary
或NSArray
取决于返回的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一种替代。
响应对象将是NSArray或NSDictionary,具体取决于指定的JSON。您需要将其转换为正确的类型才能访问数据。 –