【问题标题】:How to map JSON objects to Objective C classes?如何将 JSON 对象映射到 Objective C 类?
【发布时间】:2011-08-09 23:47:30
【问题描述】:

我正在将 JSON 格式的数据从 Web 服务器映射到 Objective C 类(在 Xcode 中建模的 NSManagedObjects,由 Core Data 处理)。对于 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"];
}

除了需要 大量 代码来处理各种类之外,这看起来既笨拙又脆弱:任何名称更改(或语言本地化)都会导致映射失败。

必须有更好的方法......我错过了什么?

【问题讨论】:

    标签: objective-c json serialization deserialization


    【解决方案1】:

    有一个名为 RestKit 的框架可以让你做到这一点。我尚未对其进行测试,但它似乎得到了一家活跃的公司的支持并且可以作为开源:http://restkit.org/

    【讨论】:

    • 谢谢 pokstad——以前没见过。我下载了 RestKit 并一直在使用它……它确实为应用程序增加了很多体积——源文件夹为 36MB!——但可能值得。如果我使用它,肯定会接受你的答案。 (我仍然希望有人会以更“原生”的方式回复。)
    • 没问题。不知道你说的原生是什么意思。 ReskKit 是专门为基于 Cocoa 的应用程序而设计的。此外,源代码大小几乎总是大于二进制大小,所以就编译后的二进制大小而言,我不会担心 36MB。
    • 很公平——RestKit 看起来是一个很好的解决方案,但如果我实现它,我将学习如何实现 RestKit,而不是学习更好的 Obj-C 技能 :) (当然有人会争辩说学习很好地实现框架更好地学习 Obj-C。)
    • 别担心,您仍然需要了解很多 Objective-C 才能真正使用该框架;)
    • 目前深入研究 Restkit,似乎很有希望。对我来说,这似乎是 iOS 中的一个常见模式,希望这次我不需要以我肮脏的方式重新发明轮子。
    【解决方案2】:

    要处理 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 字典中检索任何值,如下所示:

    NSString *stringObject = [jsonDictionary objectForKeyNotNull:@"SomeString"];
    NSArray *arrayObject = [jsonDictionary objectForKeyNotNull:@"SomeArray"];
    

    【讨论】:

    • 谢谢,Wolfgang — 这真的很有帮助。我会接受 pokstad 的回答,因为它更健壮,但我肯定也会使用这种模式。
    【解决方案3】:

    作为 RestKit 的轻量级替代品,您可以尝试 GoldenFleece,它使用受 Jackson 启发的约定优先配置模式在 JSON 和 Objective-C 对象之间进行转换。

    免责声明:我是作者。

    【讨论】:

    • 如果你推送的是你自己的库,你应该添加一个披露
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2012-02-13
    • 2017-12-24
    • 2012-01-08
    • 2019-05-27
    相关资源
    最近更新 更多