【问题标题】:Is it possible to create a generic JSON parser?是否可以创建通用 JSON 解析器?
【发布时间】:2009-12-11 09:32:26
【问题描述】:

我所说的泛型是指您将一个类和一个 JSON 传递给一个方法,并且该方法根据类定义转换对象中的 JSON 数据。
我对概念性答案和 Objective-C 方法都感兴趣。

【问题讨论】:

    标签: objective-c json parsing generics


    【解决方案1】:

    我假设使用通用解析器,您的意思是隐式 JSON 到对象的映射器。

    在这种情况下,有一个挑战。取决于变量是否是 Objective-C 中的类型,这可能是可解决的,也可能是不可解决的(我不知道这实际上是一种耻辱)。虽然将 setter 方法名称(鉴于 Objective-C 确实提供反射)映射到 JSON 属性非常简单,但很难知道为嵌套的 JSON 对象创建哪个对象。所以你需要一种工厂来猜测嵌套对象的类型。如果 Objective-C 中的变量是类型,那可能会被用作提示,如果不是,你就得靠自己了。

    【讨论】:

      【解决方案2】:

      将数据放入 NSArray 之类的东西很容易,周围有很多,例如json-framework

      试试这个(未经测试):

      #import <Cocoa/Cocoa.h>
      #import "JSON/JSON.h"
      
      int main(int argc, char *argv[])
      {
          NSLog(@"%@", [@"[ 100, 500, 300, 200, 400 ]" JSONValue]);
          return 0;
      }
      

      正如 Adrian 所说,将数据结构映射到对象是一个挑战。它不在 json-framework 中,我不知道还有什么。当然可以,但我想项目维护者会接受你的代码,如果你写一些:)。

      【讨论】:

        【解决方案3】:

        您需要对传入的未处理的类以及我所看到的其他一些语言使用反射。

        Class c = [self class];
        

        将返回一个包含变量和方法列表的 C 结构,然后编写一个数据映射器样式系统来反映该类并将 JSON 变量分配给它。

        例如JSON结构的

        var x = { prop1: "Test 1",
                  prop2: "Test 2};
        

        那就上课

        @interface x  : NSObject {
               NSString* prop1;
               NSString* prop2;
        }
        @property (nonatomic,retain) NSString* prop1;
        @property (nonatomic,retain) NSString* prop2;
        

        你需要有一个具体的实现,但它不需要做任何花哨的事情。

        然后您的映射器可以使用反射来解析对象或仅使用哑分配:

        - (NSObject)mapClassFromJSON:(NSObject)class fromJSON:(id)jsonArray
        {
        //code needs to iterate over the jsonArray (needs to check using isKindOfClass if it's an NSArray or NSDictionary) and assign the class properties to it.
        }
        

        请记住,如果每个人都使用 SBJSON,返回的 JSON 中的类型可以是 NSArray 或 NSDictionary,它需要知道哪个。如果沿着通用路径进行嵌套,则需要使用变量反射和一些智能来生成类型映射,否则需要为每个类进行硬编码。

        编辑: 来看看

        http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/class_copyPropertyList

        可能有用,也可能没用……

        【讨论】:

          【解决方案4】:

          嗯,从概念上讲,这种方法称为serialization/deserialization。不同之处在于您的序列化格式将是 JSON。实现:为您的类和 JSON 定义基本约定并实现它们。例如:每个 JSON 都应该有对应于类的 uniq-id。

          我不熟悉 Objective-C,但如果我用其他语言这样做,我会假设 JSON 中的每个键都代表类的属性。这个属性可以通过像classInstance.setJsonAttribute(key, value);这样的函数来设置然后,我会写一些JSON解析器,它会遍历JSON,提取uniq-id,基于这个id创建类,并遍历所有其他key:values解析,设置它们setJsonAttribute 函数。我认为,这将是我实施的开始。

          【讨论】:

            【解决方案5】:

            对于可能看到这篇文章的其他人来说,这是可能的!碰巧有一些开源项目已经做得很好。结帐休息套件和

            https://github.com/RestKit/RestKit

            https://github.com/dchohfi/KeyValueObjectMapping

            【讨论】:

              【解决方案6】:

              我根本不知道 Objective-c,但我知道 JSON。

              它是一种统一的数据交换格式,带有 RFC,因此您绝对可以使用自己的解析器。 Objective-c 支持泛型类型吗?如果是这样,您所寻找的将是可以实现的,并且我还猜测其他人已经准备好了。

              【讨论】:

                猜你喜欢
                • 2013-09-14
                • 1970-01-01
                • 2016-08-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多