通用类型 JSON 型号
Generic Type JSON model
这道题可能很简单也可能很难。我真的不知道 Objective-C 作为一种语言,但我正在尝试构建一个 iPhone 应用程序。我将 JSON Model 视为一个潜在的自动数据绑定库,用于将 JSON 对象转换为我的域模型。
所以这是我的问题。我有一个纯 RESTful API 的 returns 资源,具有类似于此的通用顶级对象:
{
"successMessages": [],
"errorMessages": [],
"data": {}
}
在 Java/Groovy 中,我使用类似 Jackson 的库来执行此绑定功能,并会编写 class:
public class ResponseWrapper<T>{
Collection successMessages
Collection errorMessages
T data
}
这样 ResponseWrapper<MyObject>
就能够自动将 JSON 的 data
属性 中的任何内容绑定到 MyObject
类型的对象。我还为所有集合使用了一个通用的集合包装器,它包含有关如何分页的信息,如果我能在一些帮助下弄清楚的话,我想使用相同的模式! Objective-C支持这种泛型编程吗?
Objective-C 确实有新添加的泛型。然而,它们并没有像 Java 中那样完全实现。在 Objective-C 中,您可以在接口上使用它们,但在实现中,您必须使用 id
或通用定义的基类型。
我写了一个 blog post 来展示它是如何工作的。希望这能回答您的问题。
首先:错误 Objective-C 没有泛型是完全错误的。这个都市传说的原因是大多数开发人员不知道泛型是什么。泛型是类型无关的代码。时期。这就是定义。 Java、Swift、C++ 等静态类型语言为此需要特殊的语法,以使编译器在编译时知道代码的具体类型。因此他们只支持从编辑到编译的泛型。在动态类型语言中,你不需要任何额外的 $whatever,因为泛型是内置的,从编辑到运行时都是免费的。这更强大,语言复杂度更低。
给你的问题:
在 Objective-C 中,您只需照原样创建 类,而不考虑 JSON 转移。你不必关心这个。 IE。结果如下所示:
@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 模型发表一些评论,但这不是问题的主题。)
要自己做,只需获取字典(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 中输入。
但是,您当然可以使用图书馆。 (我个人更喜欢尽可能具体,即使这意味着有更具体的代码。但我是开发人员,而不是秘书。)
这道题可能很简单也可能很难。我真的不知道 Objective-C 作为一种语言,但我正在尝试构建一个 iPhone 应用程序。我将 JSON Model 视为一个潜在的自动数据绑定库,用于将 JSON 对象转换为我的域模型。
所以这是我的问题。我有一个纯 RESTful API 的 returns 资源,具有类似于此的通用顶级对象:
{
"successMessages": [],
"errorMessages": [],
"data": {}
}
在 Java/Groovy 中,我使用类似 Jackson 的库来执行此绑定功能,并会编写 class:
public class ResponseWrapper<T>{
Collection successMessages
Collection errorMessages
T data
}
这样 ResponseWrapper<MyObject>
就能够自动将 JSON 的 data
属性 中的任何内容绑定到 MyObject
类型的对象。我还为所有集合使用了一个通用的集合包装器,它包含有关如何分页的信息,如果我能在一些帮助下弄清楚的话,我想使用相同的模式! Objective-C支持这种泛型编程吗?
Objective-C 确实有新添加的泛型。然而,它们并没有像 Java 中那样完全实现。在 Objective-C 中,您可以在接口上使用它们,但在实现中,您必须使用 id
或通用定义的基类型。
我写了一个 blog post 来展示它是如何工作的。希望这能回答您的问题。
首先:错误 Objective-C 没有泛型是完全错误的。这个都市传说的原因是大多数开发人员不知道泛型是什么。泛型是类型无关的代码。时期。这就是定义。 Java、Swift、C++ 等静态类型语言为此需要特殊的语法,以使编译器在编译时知道代码的具体类型。因此他们只支持从编辑到编译的泛型。在动态类型语言中,你不需要任何额外的 $whatever,因为泛型是内置的,从编辑到运行时都是免费的。这更强大,语言复杂度更低。
给你的问题:
在 Objective-C 中,您只需照原样创建 类,而不考虑 JSON 转移。你不必关心这个。 IE。结果如下所示:
@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 模型发表一些评论,但这不是问题的主题。)
要自己做,只需获取字典(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 中输入。
但是,您当然可以使用图书馆。 (我个人更喜欢尽可能具体,即使这意味着有更具体的代码。但我是开发人员,而不是秘书。)