我正在编写一个代码来解析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循环失败并出现异常。我该如何解决?
答案 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];