我有一系列NSObject我想序列化为JSON并发布到服务。最终对象由嵌套在彼此内的这些NSObject子类的几个级别组成。
这些对象中的每一个都遵循一个协议,该协议使用一个方法,该方法使用适当的密钥返回NSDictionary中的对象属性。但是,其中一些属性是其他对象,等等,使序列化有点复杂。
是否有一种模式可用于简化序列化最终对象?使用JSONKit,似乎我需要从最深的对象单独序列化每个字典并向后工作,检查错误,然后添加到复合字符串。我知道这不可能是使用这个非常强大的库的最佳方法。欢迎任何建议或指导。
修改1
答案 0 :(得分:8)
AutomagicCoding库使用低级属性内省将任何NSObject递归转换为NSDictionary,然后可以直接将其序列化为JSON:
https://github.com/psineur/NSObject-AutomagicCoding
它可能涉及对具有结构属性等的类进行一些微调,但它可能是您将找到的最简单,最省力的方法。
更新:
我已经编写了自己的库,HRCoding(https://github.com/nicklockwood/HRCoder),可以使用NSCoding协议将任何对象加载/保存为JSON)
答案 1 :(得分:2)
现在,您可以使用JSONModel轻松解决此问题。 JSONModel是一个基于Class一般序列化/反序列化对象的库。您甚至可以使用非基于nsobject的属性,例如int
,short
和float
。它还可以满足嵌套复杂的JSON。它为您处理错误检查。
鉴于此JSON {"firstname":"Jenson","surname":"Button"}
反序列化示例。在头文件中:
#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]);
答案 2 :(得分:1)
我不确定我是否理解这个问题。你问一个模式,但你似乎描述了标准模式:
这些对象中的每一个都遵循一个协议,该协议使用一个方法,该方法使用适当的密钥返回NSDictionary中的对象属性。
假设该方法称为serializedDictionary
。如果类具有本身是其他对象的属性,则只需调用serializedDictionary
并将结果添加到正在构建的字典中。因此,您需要做的就是向顶级对象询问其serializedDictionary
,并将其转换为JSON。
如果您担心错误处理,只需检查方法的结果并将错误传递给调用者。您可以使用异常(无代码编写)或按惯例执行此操作。例如,假设您返回nil的错误,并且还引用指向NSError实例的指针。然后在容器对象中执行以下操作:
- (NSDictionary *)serializedDictionaryWithError:(NSError **)error
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:self.someProperty forKey:@"some-property"];
NSDictionary *childDict = [self.childObject serializedDictionaryWithError:error];
if (childDict == nil) return nil;
[dict setObject:childDict forKey:@"child-object"];
return dict;
}
BAMN!