2011-04-21 57 views
6

我將JSON格式的數據從Web服務器映射到Objective C類(由Core Data處理的Xcode中建模的NSManagedObjects)。對於目標C類的每個屬性,我需要:如何將JSON對象映射到Objective C類?

  1. 確定是否該屬性的關鍵在JSON對象存在,
  2. 確定如果該鍵的值不爲空,並
  3. 傳值的模擬類的實例,如果條件1和2是真的

現在,我硬編碼這個序列中的各個屬性,所以每個屬性需要像下面的代碼:

// dictObject is the JSON object converted into a NSDictionary, 
// and person is the instance of the modeled class 

if ([dictObject objectForKey:@"nameFirst"] && 
    [dictObject objectForKey:@"nameFirst"] != [NSNull null]) { 
    person.nameFirst = [dictObject objectForKey:@"nameFirst"]; 
} 

而且需要的代碼很多處理各種類,這似乎缺憾而脆:任何名稱變更(或語言本地化)會導致映射失敗。

必須有更好的辦法......我錯過了什麼?

回答

10

有一個名爲RestKit的框架,可以讓你做到這一點。我沒有測試它,但它似乎是通過積極的公司,並支持可作爲開源:http://restkit.org/

+0

謝謝pokstad-之前沒有看到過。我下載了RestKit並一直在玩它...它爲應用程序增加了大量的大小 - 36MB的源文件夾 - 但可能是值得的。如果我使用它,肯定會接受你的答案。 (我仍然希望有人會回覆更「原生」的方法。) – Dan 2011-04-22 14:48:11

+0

沒問題。不清楚你的意思是什麼。該ReskKit是專門爲基於可可的應用程序。此外,源代碼的大小几乎總是大於二進制大小,因此就編譯二進制大小而言,我不擔心36MB。 – pokstad 2011-04-22 23:45:00

+0

公平的 - RestKit看起來像一個很好的解決方案,但是如果我實現它,我將學習如何實現RestKit,而不是學習更好的Obj-C技巧:)(儘管當然可以爭辯說學習實現框架很好_is_學習Obj-C更好。) – Dan 2011-04-23 00:01:06

11

爲了處理NULL值,使用上的NSDictionary的一個類別。我使用的是類,看起來像這樣:

的NSDictionary + Utility.h

#import <Foundation/Foundation.h> 


@interface NSDictionary (Utility) 
- (id)objectForKeyNotNull:(id)key; 
@end 

的NSDictionary + Utility.m

#import "NSDictionary+Utility.h" 


@implementation NSDictionary (Utility) 

- (id)objectForKeyNotNull:(NSString *)key { 
    id object = [self objectForKey:key]; 
    if ((NSNull *)object == [NSNull null] || (CFNullRef)object == kCFNull) 
     return nil; 

    return object; 
} 

@end 

從您的JSON字典這樣的檢索的任何值:

+0

謝謝沃爾夫岡 - 這實際上很有幫助。我會接受pokstad的答案,因爲它更健壯,但我肯定也會使用這種模式。 – Dan 2011-04-26 03:40:05

1

作爲RestKit的輕量級替代品,您可以嘗試GoldenFleece,它使用受0123ng啓發的約定優先配置模式在JSON和Objective-C對象之間進行轉換。

聲明:我是作者。

+0

如果您正在推送自己的圖書館,則應該添加一項披露 – 2016-11-10 19:37:12