基于NSObject的类的iOS JSON序列化

我想要JSON序列化我自己的自定义类。 我在Objective-C / iOS5中工作。 我想要做的事情如下:

Person* person = [self getPerson ]; // Any custom object, NOT based on NSDictionary NSString* jsonRepresentation = [JsonWriter stringWithObject:person ]; Person* clone = [JsonReader objectFromJson: jsonRepresentation withClass:[Person Class]]; 

看来,NSJSONSerialization(和其他一些库)需要“人”类基于NSDictionary等我想要的东西,将序列化任何自定义对象,我关心定义(在合理的范围内)。

让我们设想Person.h如下所示:

 #import <Foundation/Foundation.h> @interface Person : NSObject @property NSString* firstname; @property NSString* surname; @end 

我想为实例生成的JSON看起来类似于以下内容:

 {"firstname":"Jenson","surname":"Button"} 

我的应用程序使用ARC。 我需要使用对象序列化和反序列化的东西。

非常感谢。

这是一个棘手的问题,因为可以放入JSON的唯一数据是简单的对象(想想NSString,NSArray,NSNumber …),而不是自定义类或标量types。 为什么? 如果不构build各种条件语句来将所有这些数据types包装到这些types的对象中,解决scheme将如下所示:

 //at the top… #import <objC/runtime.h> NSMutableDictionary *muteDictionary = [NSMutableDictionary dictionary]; id YourClass = objc_getClass("YOURCLASSNAME"); unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(YourClass, &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; SEL propertySelector = NSSelectorFromString(propertyName); if ([classInstance respondsToSelector:propertySelector]) { [muteDictionary setValue:[classInstance performSelector:propertySelector] forKey:propertyName]; } } NSError *jsonError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:muteDictionary options:0 error:&jsonError]; 

这很棘手,不过是因为我之前说过的。 如果您有任何标量types或自定义对象,整个事情就会崩溃。 如果真的很重要,那么我会build议您考虑投入时间,查看Ricard的链接,这些链接允许您查看将帮助将值包装到NSDictionary-safe对象中的条件语句的属性types。

现在你可以使用JSONModel轻松解决这个问题。 JSONModel是一个通用的基于Class的序列化/反序列化对象的库。 你甚至可以使用基于非int shortfloat等属性。 它也可以提供嵌套复杂的JSON。

反序列化示例 。 通过参考你的例子,在头文件中:

 #import "JSONModel.h" @interface Person : JSONModel @property (nonatomic, strong) NSString* firstname; @property (nonatomic, strong) NSString* surname; @end 

在执行文件中:

 #import "JSONModelLib.h" #import "yourPersonClass.h" NSString *responseJSON = /*from somewhere*/; Person *person = [[Person alloc] initWithString:responseJSON error:&err]; if (!err) { NSLog(@"%@ %@", person.firstname, person.surname): } 

序列化示例 。 在执行文件中:

 #import "JSONModelLib.h" #import "yourPersonClass.h" Person *person = [[Person alloc] init]; person.firstname = @"Jenson"; person.surname = @"Uee"; NSLog(@"%@", [person toJSONString]); 

也许这可以帮助JLObjectStrip 。

它跟雅各布所说的一样,但是它甚至会反映到阶级的属性上。 这会给你字典/数组,然后只使用sbjson / jsonkit或什么你喜欢构造你的jsonstring。

试试这个BWJSONMatcher

这很简单,方便。

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

我为我的对象做的是我有一个名为“toDict”,返回一个nsdictionary的方法。 在这个方法中,我将需要/想要的所有属性设置为字典,例如

 [user setObject:self.first_name forKey:@"first_name"]; [user setObject:self.last_name forKey:@"last_name"]; [user setObject:self.email forKey:@"email"]; 

https://github.com/neildong/JLModel这是我写的&#x3002; 自动将JSON转换为NSObject,根据JSON设置属性。