Ошибка с NSJSONSerialization – Недопустимый тип записи JSON (меню)

У меня есть приложение, использующее core data с 3 объектами с очень похожими атрибутами. Эта взаимосвязь такова:

Филиал – >> Меню – >> Категория – >> FoodItem

Каждый объект имеет ассоциированный class: пример

введите описание изображения здесь

Я пытаюсь создать JSON-представление данных в базе данных sqlite.

//gets a single menu record which has some categories and each of these have some food items id obj = [NSArray arrayWithObject:[[DataStore singleton] getHomeMenu]]; NSError *err; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj options:NSJSONWritingPrettyPrinted error:&err]; NSLog(@"JSON = %@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]); 

Но вместо JSON я получаю ошибку SIGABRT.

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Menu)' 

Любые идеи, как это исправить или как сделать classы сущностей (Branch, Menu и т. Д.) Совместимыми с JSON-сериализацией?

Это потому, что ваш class «Меню» не сериализуется в JSON. Bascially язык не знает, как ваш объект должен быть представлен в JSON (какие поля включать, как представлять ссылки на другие объекты …)

Из справочника NSJSONSerialization Reference

Объект, который может быть преобразован в JSON, должен иметь следующие свойства:

  • Объект верхнего уровня – NSArray или NSDictionary.
  • Все объекты являются экземплярами NSString, NSNumber, NSArray, NSDictionary или NSNull.
  • Все словарные ключи являются экземплярами NSString.
  • Числа не NaN или бесконечность.

Это означает, что язык знает, как сериализовать словари. Таким образом, простой способ получить представление JSON из вашего меню – предоставить представление в виде словаря ваших экземпляров меню, которое затем будет сериализоваться в JSON:

 - (NSDictionary *)dictionaryFromMenu:(Menu)menu { [NSDictionary dictionaryWithObjectsAndKeys:[menu.dateUpdated description],@"dateUpdated", menu.categoryId, @"categoryId", //... add all the Menu properties you want to include here nil]; } 

И вы можете использовать его так:

 NSDictionary *menuDictionary = [self dictionaryFromMenu:[[DataStore singleton] getHomeMenu]]; NSError *err; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:menuDictionary options:NSJSONWritingPrettyPrinted error:&err]; NSLog(@"JSON = %@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]); 

Существует метод classа isValidJSONObject в NSJSONSerialization который сообщает вам, может ли объект быть сериализован. Как указал Жюльен, вам, вероятно, придется преобразовать свой объект в NSDictionary . NSManagedModel предоставляет некоторые удобные методы для получения всех ваших атрибутов для вашего объекта. Таким образом, вы можете создать категорию для NSManagedObject которая имеет метод преобразования ее в NSDictionary . Таким образом, вам не нужно писать метод toDictionary для каждого объекта, который вы хотите преобразовать в словарь.

 @implementation NSManagedObject (JSON) - (NSDictionary *)toDictionary { NSArray *attributes = [[self.entity attributesByName] allKeys]; NSDictionary *dict = [self dictionaryWithValuesForKeys:attributes]; return dict; } 

Вы можете использовать + isValidJSONObject: метод classа NSJSONSerialization. Если это недопустимо, вы можете использовать – initWithData: encoding: метод NSString.

 - (NSString *)prettyPrintedJson:(id)jsonObject { NSData *jsonData; if ([NSJSONSerialization isValidJSONObject:jsonObject]) { NSError *error; jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:&error]; if (error) { return nil; } } else { jsonData = jsonObject; } return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; } 

Я переключил ключ со значением: @ {значение: @ “key”} Это должно быть @ {@ “ключ”: значение}

  • В чем разница между сериализацией и маршалингом?
  • jQuery для сериализации только элементов в div
  • Управление несколькими версиями сериализованных объектов Java
  • Что библиотека JSON хорошо работает для вас в .NET?
  • Проверка того, является ли объект числом в C #
  • Как я могу расширить лексический бросок, чтобы поддерживать перечисленные типы?
  • Как узнать, когда вы загрузились через XML-сериализацию?
  • Как писать и читать java-сериализованные объекты в файл
  • Серийный список JSON <KeyValuePair >
  • Сериализация Java с несериализуемыми частями
  • ef4 причина Циркулярная ссылка в веб-службе
  • Interesting Posts

    Как операционные системы на базе Windows NT адресуют устройства?

    Могут ли ленивые модули использовать один и тот же экземпляр службы, предоставляемой их родителями?

    Есть ли способ обрабатывать async / ждать службы ASMX?

    Как пакетный файл запускает программу и задает положение и размер windows?

    Какова максимальная температура, которую могут достичь мои процессоры до причинения ущерба?

    Прочитайте и проанализируйте Json-файл в C #

    Какую команду я могу использовать для перезагрузки загрузчика?

    Как скопировать изображение внутри UIImageView?

    Как исправить ошибку «не удается открыть дисплей» при открытии X-программы после того, как ssh'ing с включенной пересылкой X11?

    Как загрузить изображение с SQL Server в окно изображения?

    Как передать права на собрания в Outlook 2010?

    Установка моноширинного шрифта на Emacs?

    Каков максимальный размер MySQL VARCHAR?

    Как отключить Windows 8?

    Уместно ли распространять Control для обеспечения неизменно безопасной функции Invoke / BeginInvoke?

    Давайте будем гением компьютера.