CoreData可选关系和JSON null

时间:2011-07-21 14:06:58

标签: objective-c core-data

我有一个包含2个对象的CoreData模型。第一个对象(图像)包含图像名称列表。第二个对象(Book)与Images对象中名为imageId的字段有关系。数据类型设置为int16,并标记为可选,默认值为0,因为并非每本书都有图像。

我从WCF服务请求Book对象的JSON表示。返回的一个书对象具有“ImageId”:null作为其值。因此,当在Objective-C中将JSON对象转换为托管对象时,我收到以下错误消息:

属性的值不可接受的类型:property =“imageId”;所需类型= NSNumber;给定type = NSNull; value =

你如何处理这种转换?我想要检查null然后将值设置为0,但这似乎不正确。

非常感谢。

* 更新* 在实现Daniels解决方案的过程中,我发现其他字段也可以从服务返回为null。因此,是否可以修改NSDictionary类别以使其能够遍历自己并用nil替换任何实例?我使用jsonKit作为我的JSON解析器,它似乎将解析后的结果作为NSMutableDictionary返回,NSDictionary对象代表我的JSON对象。我花了很多时间尝试修改我的对象,但是当它们作为NSDictionaries返回时它们是不可变的。我可以简单地在需要检查的每个字段上使用Daniels解决方案但是如果服务发生了变化而另一个字段被返回,那么这将破坏我的应用程序。或者,我可以在每个领域实施Daniels解决方案,但不确定这是否是一个特别好的解决方案。

1 个答案:

答案 0 :(得分:5)

一些JSON库允许您设置一个选项,以便从字典中省略JSON null,而不是使用NSNull。如果你这样做,那么它将起作用,因为[theDict objectForKey:@"imageID"]将返回nil。

但除此之外,正确的做法是明确地注意NSNull。制作NSDictionary类别是一种方便的方法:

@implementation NSDictionary (DDNullGetter)

- (id)nonNullObjectForKey:(id)key
{
    id val = [self objectForKey:key];
    return (val == [NSNull null] ? nil : val);
}

@end