Необязательные отношения CoreData и JSON null - PullRequest
1 голос
/ 21 июля 2011

У меня есть модель CoreData с 2 объектами. Первый объект (Изображения) содержит список имен изображений. Второй объект (Book) связан с полем из объекта Images с именем imageId. Тип данных установлен в int16 и помечен как необязательный со значением по умолчанию 0, поскольку не у каждой книги будет изображение.

Я запрашиваю JSON-представление объекта Book из службы WCF. Один из возвращенных объектов книги имеет значение ImageId: null. Поэтому при преобразовании объекта JSON в управляемый объект в Objective-C я получаю следующее сообщение об ошибке:

Недопустимый тип значения для атрибута: property = "imageId"; желаемый тип = NSNumber; данный тип = NSNull; значение =

Как вы справляетесь с этим преобразованием? Я думал о проверке на нулевое значение, а затем установил значение 0, но это кажется неправильным.

Большое спасибо.

* ОБНОВЛЕНИЕ * В процессе реализации решения Daniels я обнаружил, что другие поля также могут быть возвращены из службы как нулевые. Следовательно, возможно ли изменить категорию NSDictionary, чтобы она могла обходить себя и заменять любой экземпляр на nil? Я использую jsonKit в качестве парсера JSON, и он, похоже, возвращает проанализированный результат как NSMutableDictionary с объектами NSDictionary, представляющими мои объекты JSON. Я потратил большую часть дня, пытаясь изменить мои объекты, но так как они возвращаются как NSDictionaries, они неизменны. Я мог бы просто использовать решение Daniels для каждого поля, для которого требовалась проверка, однако, изменился ли сервис и было ли возвращено другое поле, так как это сломало бы мое приложение. В качестве альтернативы я мог бы внедрить решение Daniels в каждой области, только если это было когда-либо, но не уверен, что это хорошее решение, особенно для производительности.

1 Ответ

5 голосов
/ 21 июля 2011

Некоторые библиотеки JSON позволяют вам установить опцию так, чтобы JSON null s просто опускался из словаря, а не NSNull.Если вы сделаете это, то это сработает, потому что [theDict objectForKey:@"imageID"] вернет ноль.

Но кроме этого, правильная вещь - обратить внимание на NSNull в явном виде.Создание категории NSDictionary - удобный способ сделать это:

@implementation NSDictionary (DDNullGetter)

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

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...