gpt4 book ai didi

Objective-C、JSON 和对象映射

转载 作者:行者123 更新时间:2023-12-03 16:38:17 24 4
gpt4 key购买 nike

我正在做一些自制的解析和“对象映射”,你会发现,目前并不是真正的对象映射,而是我的目标,我需要首先找到最好的方法。

当前简化代码示例

解析器

今天我有一些专门为我的应用程序制作的解析器,这是关键方法,你会明白的。

-(void)jsonParserDidFinishParsing:(NSDictionary *)dic fromFile:(BOOL)file
{
if ([dic objectForKey:@"timeline"]) {
NSArray *items = [dic objectForKey:@"timeline"];
for (NSDictionary *item in items) {
MSTimelineItem *aItem = [[MSTimelineItem alloc]initWithDic:item];
[delegate timelineParserDidParseAnItem:aItem];
}
[delegate timelineParserDidFinishParsing];
}
}

型号

我有一些带有像这样的标准构造函数的模型(当然,在我真正的应用程序中键是常量)。

-(id)initWithDic:(NSDictionary *)dic
{
self = [super init];
if (self) {
_udid = [dic objectForKey:@"udid"];
_picUrl = [dic objectForKey:@"profile"];
_name = [dic objectForKey:@"name"];
_job = [dic objectForKey:@"job"];
}
return self;
}

目标

使其更加动态,避免在服务器更改时更改本地 key 。做一些美丽的事情......

方法

避免所有构造函数代码,我的方法是使用 KVC,命名属性与 JSON 键的名称相同,并且只保留我的 @dymanic 属性来计算事物。因此,我可以逐字循环 JSON dic 属性并使用解析器中的 setObject:ForKey

通过这种方法,我只需要保留属性,仍然是一些代码,但我可以处理它。更改服务器 key ,重构属性,完成!

问题

我有一些具有关系的对象,就像一个模型可以包含另一个模型的数组。仍然需要一些逻辑来处理这个问题。另外,保留所有属性可能仍然需要大量代码。

访问或设置不存在的属性也会导致应用程序崩溃。我能做什么呢?

结论

在所有情况下,我仍然需要在某些时候知道键/属性。访问对象属性比 object:forKey 更好,因为我会立即收到警告和错误。

我不想使用像RESTKit这样的框架,我已经为Rest事物制作了自己的框架,我只需要这种动态方法来拥有一组完全标准的类。

我也知道我没有足够的知识来思考更详细的解决方案,轮到你了:)

问题

我说得对吗?根据您的经验,最好的方法是什么,我真的很想听听您以前做过什么,为什么它有效,为什么它好或不好。

希望您喜欢这个演示;)

最佳答案

正如您所建议的,您的选择归结为使用硬编码的属性名称,以便您可以获得合成方法和点访问器,或者使用某种动态存储,并且只能通过 KVC 显式命名来访问属性。

如果您正在使用自己构建的 API,我建议标准化并记录 API 返回的 JSON 结构,这样您就不必处理更改属性名称的问题。通过这种方式,您可以使用具有匹配声明属性的命名良好且格式良好的对象在本地支持 API。当然,根据您概述的标准,这并不那么流畅,但您获得了具有常规类型属性的所有编译器和语法优势。我敢打赌这会让开发变得更加容易。

如果您的 API 返回不断变化的 JSON 结构(再次强调,不推荐),那么我建议完全避免模型映射架构,而仅使用 NSDictionary 来存储响应。

我想这里的关键点是,如果你想要一个对象模型映射到你的 API,那么你就意味着有一组模型可以传递,如果是这样的话,那么只需创建与 JSON 和不用担心美观/技术。保持简单。

关于Objective-C、JSON 和对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9995460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com