iOS的JSON序列基于NSObject的类(iOS JSON serialization for

2019-06-24 06:34发布

我想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。 我需要的东西,都将连载和使用对象进行反序列化。

非常感谢。

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

这是棘手的,虽然的因为什么我前面所说。 如果您有任何标量类型或自定义对象,整个事情来轰然倒塌。 如果这是真的重要的是获得这样的事情正在进行,我会建议寻找到投资的时候,看着里卡德的链接,让你可以看到物业类型这将帮助到值包装成NSDictionary的安全对象所需的条件语句。



Answer 2:

现在您可以轻松使用解决这个问题JSONModel 。 JSONModel是一般序列化/反序列化对象基于类的库。 你甚至可以使用基于像财产上的非NSObject的intshortfloat 。 它还可以照顾嵌套复杂的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]);


Answer 3:

也许这可以帮助JLObjectStrip 。

它一样什么雅各布说,但即使遍历到类的属性。 这会给你的字典/数组就用sbjson / jsonkit或者你更喜欢来构建你的JSON字符串什么都。



Answer 4:

试试这个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];
...


Answer 5:

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

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


文章来源: iOS JSON serialization for NSObject-based classes