如何将JSON结构转换为Objective-C中的对象?
我有一个JSON结构是这样的:如何将JSON结构转换为Objective-C中的对象?
{
id:100
contactInfo: {
name: John Doe
city: New York
}
}
和相应的客户类瓦特/下面的性质,包括一个嵌套CONTACTINFO类。
Customer.id
Customer.contactInfo.name
Customer.contactInfo.city
是否可以将JSON数据直接转换为Customer类的实例?
我知道如何获得一个NSDictionary对象,但这是非常繁琐和繁琐的工作,而宁愿转换/反序列化数据直接到客户类。
EDITED瓦特/附加信息:
在其他语言中我与那里工作是内置了JSON的反序列化的自定义对象支持。你所要做的就是将该类标记为“可序列化”,并且JSON是反序列化的,而不需要在每个类中编写自定义代码。
如果类有嵌套类,NSDictionary对象会变得非常麻烦。这将是更容易使用自定义对象的属性这样
Customer.contactInfo.name
而不是
[(NSDictionary*)[customerDict objectForKey:@"contactInfo"] objectForKey:@"name"]
因此我对一个标准的内置在Objective-C解串器的问题。
我不知道你为什么认为这很麻烦。一个简单的方法就是为客户对象提供一个初始化工具,将字典作为参数。
通过这种方式,您可以将下载的数据作为JSON,将其反序列化为字典,然后将其传递给初始值设定项以从字典中创建对象。
当你不得不使用包含嵌套对象的复杂JSON结构时,这很麻烦。一个简单的一级对象,如一些样本很容易,但不适用于现实生活中的情况。 – ChrisP 2012-02-16 18:52:06
几十个JSON库中的任何一个都会解析你的JSON字符串并将它变成一个NSDictionary。如果你不想自己编写解析器,你将不得不处理中间格式。但是,一旦你有NSDictionary中,你可以使用Key值编码(KVC)来设置你的对象的属性:
for (NSString *key in jsonDictionary) {
[customer setValue:[jsonDictionary objectForKey] forKey:key];
}
KVC内置可可,并定义setValue:forKey:
所有对象,这样你就可以通过设置属性无论他们是如何定义的名称。
你必须做一些比上面的循环更聪明的来处理你的内部ContactInfo类,但你应该能够弄清楚。为了安全起见(因为JSON可能会通过网络传播),您可能需要创建一个密钥白名单并对其进行循环,并使用valueForKeyPath:
/setValue:forKeyPath:
来处理嵌套对象。
考虑使用RestKit api(http://restkit.org/)及其对象映射系统...
下面是一些维基:https://github.com/RestKit/RestKit/wiki/Object-mapping
写你的客户类的初始化是需要JSON数据作为参数,像这样:
-(id)initWithJSONData:(NSData*)data;
您可以实现这个方法做什么Abizern建议:将数据读入字典,然后从字典中提取所需的任何值。
如果你想要看起来,另一种方法是在你的Customer类中采用NSCoding,然后创建一个反序列化JSON数据的NSCoder子类。这可能非常像NSKeyedUnarchiver。尽管如此,除非你对许多课程采取相同的方法,否则看起来并不值得。
使用此library,你可以做到以下几点:
SBJSON *parser = [[SBJSON alloc] init];
NSDictionary *customer = [parser objectWithString:jsonString];
然后,您可以使用访问属性:
[customer objectForKey:@"id"];
[[customer objectForKey:@"contactInfo"] objectForKey:@"name"];
[[customer objectForKey:@"contactInfo"] objectForKey:@"city"];
然后,您可以在您的客户类的初始化函数中使用此代码。例如:
- (id)initWithJSON:(NSString *)jsonString {
self = [super init]; // or whatever you need here
if (self) {
SBJSON *parser = [[SBJSON alloc] init];
NSDictionary *customer = [parser objectWithString:jsonString];
self.id = [customer objectForKey:@"id"];
self.contactInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[[customer objectforKey:@"contactInfo"] objectForKey:@"name"], @"name", [[customer objectforKey:@"contactInfo"] objectForKey:@"city"], @"city"]
}
return self;
}
见我的额外信息只是响应答案补充迄今。 – ChrisP 2012-02-03 18:28:54