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

问题描述 投票:3回答:6

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

objective-c json parsing generics
6个回答
1
投票

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

在这种情况下,有一个挑战。根据变量是否是Objective-C中的类型,哪一个可能可解决,(实际上我不知道这是可耻的)。尽管将setter方法名称(给Objective-C确实提供了反射)映射到JSON属性非常简单,但是很难知道要为嵌套的JSON对象创建哪个对象。因此,您需要一种可以猜测嵌套对象可能具有哪种类型的工厂。如果Objective-C中的变量是类型,则可以将其用作提示,否则,您将自己留下。


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-framework中,我不知道还有什么。可以肯定,但是我想如果您编写一些代码,则项目维护人员将接受您的代码:]。


0
投票

您需要在传入的类上使用反射,从我所看到的来看,它不能像其他语言一样处理。

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

可能有用,可能没有...


0
投票

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


0
投票

对于其他可能遇到此职位的人,有可能!碰巧有一些开源项目已经很好地做到了这一点。结帐休息套件和


-1
投票

我一点都不了解Objective-C,但我确实知道JSON。

© www.soinside.com 2019 - 2024. All rights reserved.