iOS版:从NSObject类序列化/反序列化JSON复杂一般(iOS: Serialize/Des

2019-07-20 04:15发布

任何人都有想法如何序列基于NSObject类嵌套JSON? 有序列化JSON简单的讨论在这里 ,但它不是通用的,足以应付复杂的嵌套JSON。

想象一下,这是JSON的结果:

{ "accounting" : [{ "firstName" : "John",  
                    "lastName"  : "Doe",
                    "age"       : 23 },

                  { "firstName" : "Mary",  
                    "lastName"  : "Smith",
                    "age"       : 32 }
                              ],                            
  "sales"      : [{ "firstName" : "Sally", 
                    "lastName"  : "Green",
                    "age"       : 27 },

                  { "firstName" : "Jim",   
                    "lastName"  : "Galley",
                    "age"       : 41 }
                  ]}

从这个类:

@interface Person : NSObject{}
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSNumber *age;
@end

@interface Department : NSObject{}
@property (nonatomic, strong) NSMutableArray *accounting; //contain Person class
@property (nonatomic, strong) NSMutableArray *sales; //contain Person class
@end

如何序列化/反序列化他们基于类一般?

编辑

我目前能够产生有效载荷像这样基于任何类:

NSMutableDictionary *Payload = [self serialize:objClass];

不过,这并不迎合嵌套复杂的JSON。 任何人有这个更好的解决办法? 该库基于对象类C#迎合连载/ deserialze。 我想重现一些基于NSObject的同

Answer 1:

最后,我们可以很容易地使用解决这个问题JSONModel 。 这是最好的方法为止。 JSONModel是一般序列化/反序列化对象基于类的库。 你甚至可以使用基于像财产上的非NSObject的intshortfloat 。 它还可以照顾嵌套复杂的JSON。

1)反序列化例子 。 通过参照以上的例子,在头文件:

#import "JSONModel.h"

@interface Person : JSONModel 
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSNumber *age;
@end

@protocol Person;

@interface Department : JSONModel
@property (nonatomic, strong) NSMutableArray<Person> *accounting;
@property (nonatomic, strong) NSMutableArray<Person> *sales;
@end

在实现文件:

#import "JSONModelLib.h"
#import "myJSONClass.h"

NSString *responseJSON = /*from example*/;
Department *department = [[Department alloc] initWithString:responseJSON error:&err];
if (!err)
{
    for (Person *person in department.accounting) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }

    for (Person *person in department.sales) {

        NSLog(@"%@", person.firstName);
        NSLog(@"%@", person.lastName);
        NSLog(@"%@", person.age);         
    }
}

2)序列化实施例 。 在实现文件中:

#import "JSONModelLib.h"
#import "myJSONClass.h"

Department *department = [[Department alloc] init];

Person *personAcc1 = [[Person alloc] init];
personAcc1.firstName = @"Uee";
personAcc1.lastName = @"Bae";
personAcc1.age = [NSNumber numberWithInt:22];
[department.accounting addOject:personAcc1];

Person *personSales1 = [[Person alloc] init];
personSales1.firstName = @"Sara";
personSales1.lastName = @"Jung";
personSales1.age = [NSNumber numberWithInt:20];
[department.sales addOject:personSales1];

NSLog(@"%@", [department toJSONString]);

这是序列化例子NSLog的结果:

{ "accounting" : [{ "firstName" : "Uee",  
                    "lastName"  : "Bae",
                    "age"       : 22 }
                 ],                            
  "sales"      : [{ "firstName" : "Sara", 
                    "lastName"  : "Jung",
                    "age"       : 20 }
                  ]}


Answer 2:

你必须事先知道你会被反序列化什么样的对象。 在这种情况下,你会被反序列化到一个NSDictionary有两个属性:“会计”和“销售”。 这两个属性都将是一个实例NSArray 。 该阵列将有实例NSDictionary

既然你知道每个对象真的是,一旦你已经反序列化JSON到本地对象就可以了反序列化对象的创建类的新实例。 例如:

JSONDecoder decoder = [[JSONDecoder alloc] init];
NSObject notJSON = [decoder objectWithData:jsonData];
// where jsonData is an NSData representation of your JSON
[decoder release];

Person person1 = (Person)[notJSON objectForKey:@"accounting"][0];

考虑到这个例子,你应该能够推断一个更通用的解串器。 也就是说,你要遍历您的数据来创建你的“未知”通用对象的深层复制到“已知的”特定对象。



Answer 3:

也许这可以帮助BWJSONMatcher 。 它可以帮助你轻松搭配JSON字符串或JSON对象了用一行代码你的数据模型。

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


文章来源: iOS: Serialize/Deserialize complex JSON generically from NSObject class