2014-10-17 26 views
0

我有一个for循环遍历字典的词典。它工作得很好,除非只有一个字典总数。如何在只有一个字典可用时通过字典或字典访问for循环中的局部变量?

这里是我的方法的要点:

- (NSArray *)objectsFromJSON:(NSString *)jsonString error:(NSError **)error 
{ 
    NSParameterAssert(jsonString != nil); 

    // create JSON object 
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSError *localError = nil; 
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&localError]; 
    NSDictionary *dictionaryOfDictionaries = (id)jsonObject; 

    // if not parsed successfully, error 
    if(dictionaryOfDictionaries == nil) 
    { 
     if(error != NULL) 
     { 
      *error = [NSError errorWithDomain:ErrorDomain code:MissingDataError userInfo:nil]; 
     } 

     return nil; 
    } 

    // else create objects out of parsed data 
    NSMutableArray *objectsArray = [NSMutableArray array]; 

    for(NSDictionary *objectDictionary in dictionaryOfDictionaries) 
    { 
     // required properties 
     Obj *object = [[Obj alloc] 
          initWithName:objectDictionary[@"name"] 
          Street:objectDictionary[@"street"] 
          City:objectDictionary[@"city"] 
          State:objectDictionary[@"state"] 
          ]; 

     // if error, return 
     if(object == nil) 
     { 
      if(!error) 
      { 
       *error = [NSError errorWithDomain:ErrorDomain code:MissingDataError userInfo:nil]; 
      } 

      return nil; 
     } 

     // else add to array of objects created successfully 
     [objectsArray addObject:object]; 
    } 

    return [objectsArray copy]; 
} 

如前所述,这工作正常 - 即所有的object S的成功创建了objectDictionary的 - 如果有在dictionaryOfDictionaries不止一个字典。但是,如果只有一个词典,objectDictionary最后在for循环(而不是Obj)中输入id,并尝试访问其值(如objectDictionary[@"name"])会导致错误。

如何最有效地写这个,以便处理一个字典的情况?

+0

什么是objectDictionary'的'实际类型时,只有一个解释? – rmaddy 2014-10-17 20:02:51

+0

一个词典案例中的错误是什么? – Paulw11 2014-10-17 20:14:43

+0

我猜测,当只有一个字典返回给你时,它不会打包到数组中,而是直接返回。你应该检查'dictionaryOfDictionaries'的类型。 – 2014-10-17 20:55:18

回答

1

这里的问题。当你有多个字典时,你实际上会得到一个字典数组。换句话说,jsonObject实际上是包含每个字典的NSArray

当只有一个字典时,jsonObject就是那一个字典。

更改您这样的代码:

id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&localError]; 
NSArray *arrayOfDictionaries = nil; 
if (jsonObject == nil) { 
    // handle error 
} else if ([jsonObject isKindOfClass:[NSArray class]]) { 
    arrayOfDictionaries = jsonObject; 
} else { 
    arrayOfDictionaries = @[ jsonObject ]; 
} 

然后改变for环路:

for(NSDictionary *objectDictionary in arrayOfDictionaries) 
+0

完美的作品 – 2014-10-17 21:18:35

0

创建从JSON响应阵列,这将是字典

NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; 
if (error) 
    NSLog(@"JSONObjectWithData error: %@", error); 

for (NSMutableDictionary *dictionary in array) 
{ 
    //Do what you want to do 
} 
+0

仍然出现同样的问题 – 2014-10-17 20:55:15

+0

告诉我日志kindl – 2014-10-17 20:56:31