CoreData可选关系和JSON null

Cra*_*gly 1 core-data objective-c

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

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

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

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

非常感谢.

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

Dan*_*son 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
Run Code Online (Sandbox Code Playgroud)