Сериализация и десериализация объектов Objective-C в JSON
Мне нужно сериализовать и десериализовать объекты объектива-c в JSON для хранения в CouchDB. У людей есть какой-нибудь примерный код для лучшей практики для общего решения? Я посмотрел на несколько JSON-фреймворков, и они остановились на уровне NSDictionary / NSArray. т.е. множество фреймов сериализует и десериализует NSDictionary / NSArray в JSON. Но мне все же приходится выполнять работу по преобразованию NSDictionary в объекты Objective-C.
Чтобы сделать вещи более сложными, мой объект А может иметь ссылку на NSArray / NSDictionary объекта B.
Мой вопрос очень похож на этот вопрос с добавлением требования к сборке.
- UIScrollView не прокручивается после обновления до iOS7 / xcode 5
- Как получить текущее название города?
- запись NSDictionary для plist в моем приложении
- Сравнение двух NSDates и игнорирование временной составляющей
- Могу ли я отключить прокрутку звука UIPickerView?
Создание пользовательского classа из NSDictionary
- Могу ли я передать блок как @selector с Objective-C?
- iphone error: expected '=', ',', ';', 'asm' или '__attribute__' перед '' foo '
- как получить ip-адрес iphone программно
- Тип аксессуара UITableViewCell, проверенный на доступ и установка других непроверенных
- Как отменить 2 Modal View Controllers в последовательности?
- Обнаружение iPhone / iPod Touch
- Нажмите ViewController справа налево с помощью UINavigationController
- Как написать данные в plist?
Похоже, вы ищете библиотеку сериализации, которая позволяет конвертировать объекты ваших собственных пользовательских classов в JSON, а затем восстанавливать их обратно. Сериализация типов списка свойств (NSArray, NSNumber и т. Д.) Уже существует в сторонних библиотеках и даже встроена в OS X 10.7 и iOS 5.
Итак, я думаю, что ответ в основном «нет». Я задал этот точный вопрос месяц или два назад в списке рассылки по cocoa-dev, а ближайший я попал в хит от Майка Абдуллы, указав на экспериментальную библиотеку, которую он написал:
https://github.com/mikeabdullah/KSPropertyListEncoder
Это архивирует объекты для списков свойств в памяти, но, как я уже сказал, уже есть API для их преобразования в JSON.
Также есть коммерческое приложение под названием Objectify, которое утверждает, что может сделать что-то подобное:
http://tigerbears.com/objectify/
Возможно, я закончу реализацию того, что вы просите, как часть моей библиотеки CouchCocoa, но я еще не погрузился в эту задачу.
Наконец, мы можем легко решить эту проблему с помощью JSONModel . Это лучший метод. JSONModel – это библиотека, которая в общем случае сериализует / десериализует ваш объект на основе classа. Вы даже можете использовать non-nsobject, основанный на свойстве типа int
, short
и float
. Он также может обслуживать сложный комплекс JSON.
Учитывая этот пример JSON:
{ "accounting" : [{ "firstName" : "John", "lastName" : "Doe", "age" : 23 }, { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 } ], "sales" : [{ "firstName" : "Sally", "lastName" : "Green", "age" : 27 }, { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 } ]}
1) Пример десериализации . в заголовочном файле:
#import "JSONModel.h" @interface Person : JSONModel @property (nonatomic, strong) NSString *firstName; @property (nonatomic, strong) NSString *lastName; @property (nonatomic, strong) NSNumber *age; @end @protocol Person; @interface Department : JSONModel @property (nonatomic, strong) NSMutableArray *accounting; @property (nonatomic, strong) NSMutableArray *sales; @end
в файле реализации:
#import "JSONModelLib.h" #import "myJSONClass.h" NSString *responseJSON = /*from example*/; Department *department = [[Department alloc] initWithString:responseJSON error:&err]; if (!err) { for (Person *person in department.accounting) { NSLog(@"%@", person.firstName); NSLog(@"%@", person.lastName); NSLog(@"%@", person.age); } for (Person *person in department.sales) { NSLog(@"%@", person.firstName); NSLog(@"%@", person.lastName); NSLog(@"%@", person.age); } }
2) Сериализовать пример . В файле реализации:
#import "JSONModelLib.h" #import "myJSONClass.h" Department *department = [[Department alloc] init]; Person *personAcc1 = [[Person alloc] init]; personAcc1.firstName = @"Uee"; personAcc1.lastName = @"Bae"; personAcc1.age = [NSNumber numberWithInt:22]; [department.accounting addOject:personAcc1]; Person *personSales1 = [[Person alloc] init]; personSales1.firstName = @"Sara"; personSales1.lastName = @"Jung"; personSales1.age = [NSNumber numberWithInt:20]; [department.sales addOject:personSales1]; NSLog(@"%@", [department toJSONString]);
И это результат NSLog из примера Serialize:
{ "accounting" : [{ "firstName" : "Uee", "lastName" : "Bae", "age" : 22 } ], "sales" : [{ "firstName" : "Sara", "lastName" : "Jung", "age" : 20 } ]}
Вы можете легко добавить JSON-возможности в class NSObject с помощью NSDictionary, NSArray и NSJSONSerialization
Сериализация:
Просто посмотрите на пример, который будет очень легко понять.
Добавление возможности JSON к classу NSObject: –
@interface JsonClassEmp : NSObject @property(strong,nonatomic)NSString *EmpName,*EmpCode; -(NSDictionary*)GetJsonDict; @end @implementation JsonClassEmp @synthesize EmpName,EmpCode; //Add all the properties of the class in it. -(NSDictionary*)GetJsonDict { return [NSDictionary dictionaryWithObjectsAndKeys:EmpName,@"EmpName",EmpCode,@"EmpCode", nil]; } @end
Генератор строк JSON: –
В iOS 5 Apple представила NSJSONSerialization для parsingа строк JSON, так что мы будем генерировать строку JSON.
-(NSString*)GetJSON:(id)object { NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; return jsonString; }
Переход на реализацию Apple всегда безопаснее, поскольку у вас есть гарантия, что он будет поддерживаться и обновляться.
Способ использования: –
- (void)viewDidLoad { [super viewDidLoad]; JsonClassEmp *emp1=[[JsonClassEmp alloc]init]; [emp1 setEmpName:@"Name1"]; [emp1 setEmpCode:@"1"]; JsonClassEmp *emp2=[[JsonClassEmp alloc]init]; [emp2 setEmpName:@"Name2"]; [emp2 setEmpCode:@"2"]; //Add the NSDictionaries of the instances in NSArray NSArray *[email protected][emp1.GetJsonDict,emp2.GetJsonDict]; NSLog(@"JSON Output: %@", [self GetJSON:arrEmps_Json]); }
Справка
Десериализация:
Обычный способ получения десериализованных данных в NSDictionary или NSArray затем присваивает его свойствам classа.
Я уверен, что используя описанные выше методы и идеи, вы можете легко сериализовать и десериализовать сложный json.
Вы можете попробовать JTObjectMapping . Их описание:
JTObjectMapping – вдохновлен RestKit. Очень простая объектно-c-структура, которая отображает ответ JSON из NSDictionary или NSArray в подclassы NSObject для iOS.
Он очень маленький (в отличие от RestKit) и отлично работает.
Это возможно с помощью системы отображения объектов библиотеки RestKit.
У меня есть простой class модели, который я хотел бы превратить в JSON-Object.
Для этого я добавил метод jsonData в мой class модели: метод превращает свойства модели в объекты фундамента (int numbers в объекты NSNumber и т. Д.). Затем словарь заполняется этими объектами и соответствующими ключами (также позже JSON). После проверки (необязательно) проверки достоверности объект данных JSON создается с помощью метода NSJSONSerialization «dataWithJSONObject» и возвращается.
- (NSData *)jsonData { NSDictionary *root = @{@"Sport" : @(_sportID), // I´m using literals here for brevity's sake @"Skill" : @(_skillLevel), @"Visibility" : @(_visibility), @"NotificationRange" : @(_notificationRange)}; if ([NSJSONSerialization isValidJSONObject:root]) { NSData *jsonData = [NSJSONSerialization dataWithJSONObject:root options:0 error:nil]; return jsonData; } return nil;
}