iPhone - JSONKit - 工作,但我使用它吗?

时间:2011-06-29 15:17:51

标签: iphone objective-c

我使用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];
    }

2 个答案:

答案 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:

来防止这种情况发生