NSDictionary包含NSNull *

时间:2016-02-17 17:21:46

标签: ios objective-c

我正在编写一个代码来解析json响应,方法如下:

 NSDictionary* jsonArray = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
 if (jsonArray == nil) {
            // returns empty array
            return layouts;
 }
 NSDictionary* sections = [jsonArray valueForKey:@"section"];
 for (NSDictionary* section in sections) {

不幸的是,“section”有时是空的,我最终得到的部分是__NSArrayI *,其中包含一个元素 - NSNull *。这会导致for循环失败并出现异常。我该如何解决?

2 个答案:

答案 0 :(得分:3)

我曾经在NSDictionary扩展上有一个清理方法,帮助我解决了这个问题。基本上,该方法遍历字典中的所有键并删除与NSNull()匹配的任何值,返回“干净”字典和数组。诀窍是你还必须通过嵌套字典进行递归。那么,在伪代码中,它看起来像这样:

func cleanup() -> NSDictionary {
    let newDictionary = NSDictionary()
    for key in dictionary.copy {
        if dictionary[key] is NSDictionary {
            newDictionary[key] = dictionary[key].cleanup()
        } else if dictionary[key] is NSArray {
            newDictionary[key] = dictionary[key].filter( $0 != NSNull() )
        } else if dictionary[key] !=  NSNull() {
            newDictionary[key] = dictionary[key]
        }
    return newDictionary
}

希望这有帮助!

答案 1 :(得分:1)

只需将此函数添加到解析器并调用它

即可
- (id)objectForKeyNotNull:(NSString*)key inDict:(NSDictionary*)map {
    id object = [map objectForKey:key];
    if (object == [NSNull null])
        return nil;
      else
        return object;
}

然后你可以在你的解析器中这样调用它:

 // will set myObject to nil if it is null in the JSON response
 myObject = [self objectForKeyNotNull:@"keyNameInDict" inDict:yourDictionary];