JSON-сериализация NSOrderedSet в iOS

Каковы мои варианты для сериализации и десериализации NSOrderedSets в JSON? Я использую iOS5 / Objective-C. Я думаю, я мог бы свернуть свой собственный, но я предполагаю, что есть некоторые хорошие существующие фреймворки...

2 ответа

Решение

Вероятно, единственный вариант - получить доступ к библиотеке OpenSource и взглянуть на код реализации JSON Serializer. Тогда вы могли бы расширить библиотеку для ваших целей. Под "расширением" я подразумеваю, что вы должны максимально использовать существующую библиотеку, поскольку создание собственного сериализатора с нуля может потребовать много работы.

Обычно библиотеки JSON определяют отображение между типами JSON и соответствующими типами (классами) Objective-C. Например, массив JSON отображается на NSArray /NSMutableArray, объект JSON отображается на NSDictionary/NSMutableDictionary и т. Д.

Поэтому "Сериализатор JSON" "знает", как сериализовать "сопоставленный" объект Objective-C в элемент JSON. Один из способов реализовать это поведение - добавить категорию в сопоставленный класс Objective-C.

Таким образом, при "расширении библиотеки" (в зависимости от библиотеки и реализации) может быть достаточно просто добавить категорию для ваших пользовательских классов и реализовать ее соответствующим образом.

Я автор библиотеки JSON. Создание категорий для пользовательских классов, которые затем можно использовать в сериализаторе JSON, не потребует особых усилий. Вы можете указать свои потребности в запросе на расширение, чтобы я мог настроить библиотеку, чтобы упростить добавление пользовательских классов.

Ваша категория будет выглядеть следующим образом:

@interface NSOrderedSet (JPJsonWriter) <JPJsonWriterInserterProtocol>
@end

@implementation NSOrderedSet (JPJsonWriter)

- (int) JPJsonWriter_insertIntoBuffer:(NSMutableDataPushbackBuffer*)buffer 
                             encoding:(JPUnicodeEncoding)encoding
                              options:(JPJsonWriterOptions)options
                                level:(NSUInteger)level
{
    return insertJsonArray(self, buffer, encoding, options, level);
}

@end

Это на самом деле все, что вам нужно сделать - после внесения некоторых изменений в мою библиотеку. Но обратите внимание: это зависит от используемой вами библиотеки JSON. Вы можете найти мою библиотеку JSON здесь. Пожалуйста, отправьте запрос на улучшение - спасибо.

Так как у JSON нет set тип данных и его Array заказано, вы можете преобразовать в NSArray сначала, а затем сериализовать, как это:

NSOrderedSet *os = [NSOrderedSet orderedSetWithObjects:@"1", @"2", @"3", nil];
NSArray *jsonArr = [os array];
// JSON Data
NSData *json = [NSJSONSerialization dataWithJSONObject:jsonArr options:0 error:nil];
// JSON String representation
NSString *jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
Другие вопросы по тегам