2012-02-03 120 views
0

我有一个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解串器的问题。

+0

见我的额外信息只是响应答案补充迄今。 – ChrisP 2012-02-03 18:28:54

回答

1

我不知道你为什么认为这很麻烦。一个简单的方法就是为客户对象提供一个初始化工具,将字典作为参数。

通过这种方式,您可以将下载的数据作为JSON,将其反序列化为字典,然后将其传递给初始值设定项以从字典中创建对象。

+0

当你不得不使用包含嵌套对象的复杂JSON结构时,这很麻烦。一个简单的一级对象,如一些样本很容易,但不适用于现实生活中的情况。 – ChrisP 2012-02-16 18:52:06

1

几十个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:来处理嵌套对象。

0

写你的客户类的初始化是需要JSON数据作为参数,像这样:

-(id)initWithJSONData:(NSData*)data; 

您可以实现这个方法做什么Abizern建议:将数据读入字典,然后从字典中提取所需的任何值。

如果你想要看起来,另一种方法是在你的Customer类中采用NSCoding,然后创建一个反序列化JSON数据的NSCoder子类。这可能非常像NSKeyedUnarchiver。尽管如此,除非你对许多课程采取相同的方法,否则看起来并不值得。

0

使用此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; 
}