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];