簡體   English   中英

通用類型JSON模型

[英]Generic Type JSON model

這個問題可能很容易,也很難。 我不太了解Objective-C是一種語言,但是無論如何我都在嘗試構建iPhone應用程序。 我將JSON模型視為一種潛在的自動數據綁定庫,用於將JSON對象轉換為我的域模型。

所以這是我的問題。 我有一個純粹的RESTful API,它返回的資源帶有類似於以下內容的通用頂級對象:

{
    "successMessages": [],
    "errorMessages": [],
    "data": {}
}

在Java / Groovy中,我使用類似Jackson的庫來執行此綁定功能,並將編寫一個類:

public class ResponseWrapper<T>{
    Collection successMessages
    Collection errorMessages
    T data
}

這樣, ResponseWrapper<MyObject>將能夠將JSON的data屬性內的任何內容自動綁定到MyObject類型的對象。 我還對所有包含有關如何分頁的信息的集合使用一個通用的集合包裝器,並且如果可以在一些幫助下找到它,也希望使用相同的模式! Objective-C是否支持這種通用編程?

Objective-C確實有新添加的泛型。 但是,它們並沒有像Java中那樣完全實現。 在Objective-C中,可以在接口上使用它們,但是在實現中,必須使用通用定義的id或基本類型。

我寫了一篇博客文章 ,展示了它的工作原理。 希望那能回答您的問題。

首先:Objective-C沒有泛型完全是錯誤的 這個城市傳說的原因是大多數開發人員都不知道泛型是什么。 泛型是與類型無關的代碼。 期。 那就是定義。 諸如Java,Swift,C ++等靜態類型的語言為此需要特殊的語法,以使編譯器在編譯時知道具體的代碼類型。 因此,它們僅從編輯到編譯都支持泛型。 在動態類型語言中,您不需要任何$,因為泛型是內置的,從編輯到運行時都是免費的。 這樣功能更強大,語言復雜度更低。

給你的問:

在Objective-C中,您可以像無需進行JSON傳輸那樣簡單地創建類。 您不必為此擔心。 結果看起來像這樣:

@interface ModelClass : NSObject
@property NSArray *successMessages;
@property NSArray *errorMessages;
@property AnotherClass data; // If you do not want to have concrete types here, use id
@end

要填充屬性,可以使用框架。 但這不是必需的。 (而且我會對JSON模型發表一些評論,但這不是Q的主題。)

要自己做,只需獲取字典(JSON對象)並從中創建一個實例:

@implementation NSObject (JSONToInstance)
- (id)initFromJSON:(NSDictionary*)JSON dataTypes:(NSDictionary*)types
{
  self = [super init];
  if (self)
  {
    for( NSString *key in JSON )
    {
      id value = JSON[key];
      NSDictionary *types = types[key];
      Class type = NSClassFromString(key);
      if (types)
      {
        id value = [[type alloc] initWithJSON:value dataType:types];
      }
      [self setValue:value forKey:key];
    }
  }
  return self;
}
@end

要使用它:

…
NSDictionary *JSON = …;
// Model refers to person and person has no "generic object" at all.
ModelClass *model = [[ModelClass alloc] initWithJSON:JSON dataTypes:@{ @"Person" : @()];

在Safari中輸入。

但是,當然,您可以使用一個庫。 (我個人更喜歡盡可能具體,即使這意味着要有更具體的代碼。但是我是開發人員,而不是秘書。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM