2011-04-23 54 views
7

在java-land中,有一些有用的庫將JSON字符串轉換爲匹配類型的對象。我見過的可可的json庫只是創建嵌套的NSDictionaries和NSArrays。有沒有一種工具可以進行額外的步驟來重構我想要的任何對象類型?Cocoa:將json字符串反序列化爲自定義對象(非NSDictionary,NSArray)

因此,舉例來說,如果我有一類被稱爲「麒麟」,具有財產「maneColor」,我有JSON,看起來像這樣:

{ 
"maneColor":"silver" 
} 

我能夠自動發起與獨角獸對象「maneColor」設置爲「silver」。

+0

+1獨角獸 – psy 2012-05-04 16:32:21

回答

7

我不知道任何特定的實現,但鍵值編碼讓你非常接近你想要的:Key Value Coding Guide。我已將streamed json parsing與KVC結合起來,取得了不錯的成績。

-setValue:forKey:方法使序列化數據適應自定義對象非常簡單。要繼續你的例子,你需要創建一個具有所有必需的訪問器方法的Unicorn類:-setName:/ - name,-setManeColor/-maneColor等等(你可以使用某些期望值的屬性,但有與maneColor值一樣,您可能希望編寫自定義setter以從顏色名稱字符串轉換爲NSColor或UIColor對象。)

您還需要將另外兩個方法添加到自定義對象:-setValue:forUndefinedKey:和-valueForUndefinedKey :.如果你的對象沒有匹配傳遞給KVC方法的鍵的訪問器方法,那麼這些方法將被調用。您可以在這裏捕獲意外或不支持的值,並根據需要存儲或忽略它們。

當您將-setValue:forKey:發送給Unicorn對象時,框架將查找與鍵模式匹配的訪問器。例如,如果鍵是「maneColor」,並且您正在設置該值,那麼框架將檢查您的對象是否實現了-setManeColor :.如果是這樣,它調用該方法,傳入值;否則,調用-setValue:forUndefinedKey:,如果對象沒有實現它,則拋出異常。

當解析器的委託收到解析json獨角獸對象的通知已經開始時,實例化一個Unicorn對象。當你的解析器返回的分析數據給你,用-setValue:forKey:將數據添加到您的對象:

- (void)parserDidBeginParsingDictionary: (SomeParser *)p 
{ 
    self.currentUnicorn = [ Unicorn unicorn ]; 
} 

- (void)parser: (SomeParser *)p didParseString: (NSString *)string 
      forKey: (NSString *)key 
{ 
    [ self.currentUnicorn setValue: string forKey: key ] 
} 

- (void)parserDidFinishParsingDictionary: (SomeParser *)p 
{ 
    [ self.unicorns addObject: self.currentUnicorn ]; 
} 
+0

謝謝你更緊張!這當然接近我正在尋找的東西。 – morgancodes 2011-05-04 17:30:54

7

使用Jastor - https://github.com/elado/jastor 需要已經被解析成JSON NSDictionary的和充滿真實Objective-的實例C類。

NSDictionary *parsedJSON = (yajl, JSONKit etc) 
Unicorn *unicorn = [[Unicorn alloc] initWithDictionary:parsedJSON]; 

unicorn.maneColor // "silver" 
+0

另一種方法是KVCObjectMapping。 https://github.com/tuyennguyencanada/KVCObjectMapping – occulus 2013-03-25 21:57:49

0

蘋果加入NSJSONSerialization類到iOS 5.0,而根據該documentation,執行以下操作:

您使用NSJSONSerialization類JSON轉換爲基金 對象和轉換Foundation對象到JSON 。

可轉化爲JSON必須具有以下 屬性的對象:

頂層對象是一個NSArray或NSDictionary的。所有對象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的實例 。所有 字典鍵都是NSString的實例。數字不是NaN或 無限。

這是tutorialwrapper method爲您開始。

+1

請注意,「NSJSONSerialization'只能與Foundation對象一起運行。我相信獨角獸類不是基礎類:) – ULazdins 2012-09-10 12:20:07

1

由於NSObject任何子類符合NSKeyValueCoding協議:

NSDictionary *parsedJSON = //whatever 
id <NSKeyValueCoding> entity = [[CustomNSObjectSubclass alloc] init]; 
[entity setValuesForKeysWithDictionary:parsedJSON]; 
相關問題