当前位置: 首页 > 面试题库 >

iOS:通常从NSObject类序列化/反序列化复杂的JSON

越星晖
2023-03-14
问题内容

有人知道如何基于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#库可根据对象类进行序列化/反序列化。我想基于NSObject复制相同的东西


问题答案:

最后,我们可以使用JSONModel轻松解决此问题。这是迄今为止最好的方法。JSONModel是一个库,该库通常基于Class序列化/反序列化您的对象。你甚至可以使用基于像财产上的非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]);

这是来自Serialize示例的NSLog结果:

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


 类似资料:
  • 问题内容: 我想对自己的自定义类进行JSON序列化。我正在使用Objective-C / iOS5。我想要执行以下操作: 看来NSJSONSerialization(和其他几个库)要求’person’类基于NSDictionary等。我想要一些可以序列化我想要定义的自定义对象的对象(在合理范围内)。 假设Person.h看起来像这样: 我希望为实例生成的JSON与以下内容相似: 我的应用程序使用A

  • 本文向大家介绍C#实现复杂XML的序列化与反序列化,包括了C#实现复杂XML的序列化与反序列化的使用技巧和注意事项,需要的朋友参考一下 本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法。分享给大家供大家参考。具体方法如下: 已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象。 Default.XML文件如下: C#示例代码如下: PS:这里再为大家

  • 我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并