一尘不染

iOS JSON序列化用于基于NSObject的类

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(和其他几个库)要求’person’类基于NSDictionary等。我想要一些可以序列化我想要定义的自定义对象的对象(在合理范围内)。

假设Person.h看起来像这样:

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

我希望为实例生成的JSON与以下内容相似:

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

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

非常感谢。


阅读 304

收藏
2020-07-27

共1个答案

一尘不染

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

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

尽管由于我之前所说,这很棘手。如果您有任何标量类型或自定义对象,那么整个过程就会崩溃。如果真的需要进行这样的事情,我建议您花些时间并查看Ricard的链接,这些链接使您可以查看有助于将值包装到NSDictionary安全对象中的条件语句的属性类型。

2020-07-27