2012-02-03 114 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; 
}