iOS:通常从NSObject类序列化/反序列化复杂的JSON

任何人都知道如何序列化基于NSObject类的嵌套JSON? 有一个讨论序列化简单的JSON 在这里 ,但它不足以满足复杂的嵌套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 } ]} 

从这堂课:

 @interface Person : NSObject{} @property (nonatomic, strong) NSString *firstName; @property (nonatomic, strong) NSString *lastName; @property (nonatomic, strong) NSNumber *age; @end @interface Department : NSObject{} @property (nonatomic, strong) NSMutableArray *accounting; //contain Person class @property (nonatomic, strong) NSMutableArray *sales; //contain Person class @end 

如何基于类一般序列化/反序列化它们?

编辑

目前我能够基于任何类生成像这样的有效载荷:

 NSMutableDictionary *Payload = [self serialize:objClass]; 

但是它并不能满足复杂的JSON。 任何人有更好的解决scheme呢? C#的这个库可以基于对象类序列化/反序列化。 我想重现一些基于NSObject的东西

最后我们可以使用JSONModel轻松解决这个问题。 这是迄今为止最好的方法。 JSONModel是一个通用的基于Class的序列化/反序列化对象的库。 你甚至可以使用基于非int shortfloat等属性。 它也可以提供嵌套复杂的JSON。

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<Person> *accounting; @property (nonatomic, strong) NSMutableArray<Person> *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]); 

这是来自Serialize示例的NSLog结果:

 { "accounting" : [{ "firstName" : "Uee", "lastName" : "Bae", "age" : 22 } ], "sales" : [{ "firstName" : "Sara", "lastName" : "Jung", "age" : 20 } ]} 

你必须提前知道你将要反序列化什么样的对象。 在这种情况下,你将被反序列化为一个NSDictionary ,它有两个属性:“会计”和“销售”。 每个属性都是NSArray一个实例。 数组将有NSDictionary实例。

既然你知道这些对象究竟是什么,那么一旦你将JSON反序列化为本地对象,就可以从反序列化的对象中创build你的类的新实例。 例如:

 JSONDecoder decoder = [[JSONDecoder alloc] init]; NSObject notJSON = [decoder objectWithData:jsonData]; // where jsonData is an NSData representation of your JSON [decoder release]; Person person1 = (Person)[notJSON objectForKey:@"accounting"][0]; 

鉴于这个例子,你应该能够外推到一个更通用的解串器。 也就是说,你需要遍历你的数据来创build一个“未知”通用对象的深层拷贝到“已知”特定对象。

也许这个可以帮助BWJSONMatcher 。 它可以帮助您用一行代码轻松地将JSONstring或JSON对象与数据模型进行匹配。

 ... NSString *jsonString = @"{your-json-string}"; YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString]; NSDictionary *jsonObject = @{your-json-object}; YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject]; ... YourValueObject *dataModel = instance-of-your-value-object; NSString *jsonString = [dataModel toJSONString]; NSDictionary *jsonObject = [dataModel toJSONObject]; ...