将复杂的NSObject序列化为JSON模式

时间:2012-02-08 17:18:47

标签: ios json jsonkit

我有一系列NSObject我想序列化为JSON并发布到服务。最终对象由嵌套在彼此内的这些NSObject子类的几个级别组成。

这些对象中的每一个都遵循一个协议,该协议使用一个方法,该方法使用适当的密钥返回NSDictionary中的对象属性。但是,其中一些属性是其他对象,等等,使序列化有点复杂。

是否有一种模式可用于简化序列化最终对象?使用JSONKit,似乎我需要从最深的对象单独序列化每个字典并向后工作,检查错误,然后添加到复合字符串。我知道这不可能是使用这个非常强大的库的最佳方法。欢迎任何建议或指导。

修改1

JSONKit GitHub URL

JSONKit Readme Documentation

3 个答案:

答案 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的属性,例如intshortfloat。它还可以满足嵌套复杂的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!