是否可以创建通用的JSON解析器?

时间:2009-12-11 09:32:26

标签: objective-c json parsing generics

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

6 个答案:

答案 0 :(得分:1)

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

在这种情况下,有一个挑战。取决于变量是否是Objective-C中的类型,这可能是也可能是不可解决的(实际上这是一种耻辱我不知道)。虽然映射setter方法名称(给定Objective-C确实为jason属性提供反射)非常简单,但很难知道为嵌套的jason对象创建哪个对象。因此,您需要一种工具来猜测嵌套对象可能具有哪种类型。如果Objective-C中的变量是类型,那么可以用作提示,如果不是,则由你自己保留。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你需要在传入的类中使用反射,而不是我能看到的其他一些语言。

Class c = [self class];

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

E.g。

的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

可能有用,可能不会......

答案 3 :(得分:0)

将数据输入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框架中,我不知道还有什么。当然,但我想项目维护者会接受你的代码,如果你写一些:)。

答案 4 :(得分:0)

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

https://github.com/RestKit/RestKit

https://github.com/dchohfi/KeyValueObjectMapping

答案 5 :(得分:-1)

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

它是一种统一的数据交换格式,带有RFC,因此您肯定能够为自己的解析器角色。 objective-c是否支持泛型类型?如果是这样,你所寻找的东西是可以实现的,并且id也猜测其他人已经准备就绪了。