使用 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。您需要做的只是根据您的响应类型(可能是一个数组)转换为NSArray
或NSDictionary
。
【讨论】:
我认为这是有道理的并尝试了一下,但出了点问题。我将 responseObject 转换为一个员工数组(就像你上面所说的那样),但这些值都是垃圾。我遍历一个循环,试图一个一个地加载我的员工,这样我就可以写出一个文件[我在上面修改了我的代码],但它每次都会崩溃。【参考方案2】:尝试将您的运营经理的响应序列化程序设置为 [AFJSONResponseSerializer 序列化程序]
您设置了 requestSerializer,而不是 responseSerializer。 (:
myOperationManager.responseSerializer = [AFJSONResponseSerializer serializer];
【讨论】:
【参考方案3】:这里的技巧是使用AFJSONRequestOperation
,它会根据返回的 JSON 类型自动将接收到的响应转换为NSDictionary
或NSArray
。我将以下代码用于返回 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的主要内容,如果未能解决你的问题,请参考以下文章