我使用JSON Kit进行了一些反序列化。它工作正常,但我写的东西很笨重。任何人都可以建议一些改进:)
//call web service with url and staff id
NSString *result = [MobileAppDelegate webServiceExecuteGetSingleWithId:StaffId
atUrl:@"XXXXXXXX"];
//create NSDictionary from JSON return type
NSDictionary *items = [result objectFromJSONString];
NSArray *ar = (NSArray*)[items objectForKey:@"SummaryJsonResult"];
for(int i = 0; i < [ar count]; i++){
NSDictionary *tmpDict = (NSDictionary*)[ar objectAtIndex:i];
AlertItem *tmpItem = [[AlertItem alloc] init];
tmpItem.Description = [tmpDict objectForKey:@"Description"];
tmpItem.NumItems = [tmpDict objectForKey:@"ItemCount"];
tmpItem.ModuleGroup = [tmpDict objectForKey:@"ModuleGroup"];
tmpItem.StaffID = [tmpDict objectForKey:@"StaffID"];
tmpItem.status - [tmpDict objectForKey:@"Status"];
[array addObject: tmpItem];
[tmpItem release];
}
答案 0 :(得分:2)
这基本上就是你必须要做的。你可以稍微清理一下:
使用for-in
循环:
for (NSDictionary *tmpDict in [items objectForKey:@"SummaryJsonResult"]) {
...
重构从字典中创建AlertItem
到工厂方法:
+ (AlertItem *)alertItemWithDictionary:(NSDictionary *)dict {
AlertItem *item = [[self alloc] init];
...do the same stuff you do in the loop
return [item autorelease];
}
... then in the loop you just do:
[array addObject:[AlertItem alertItemWithDictionary:tempDict]];
答案 1 :(得分:1)
首先,好像你正在同步执行你的请求,这通常是一个坏主意。如果您在主线程上运行此操作,则会阻止所有用户交互,直到请求完成为止。
您的代码也无法处理任何格式错误的数据。如果JSON中的任何对象与您预期的类型不同,您的应用程序将崩溃。如果“SummaryJsonResult”指向字典而不是数组,则在尝试向其发送objectForKey:
消息时,会出现“无法识别的选择器”异常。您可以使用isKindOfClass:
或respondsToSelector:
。