【发布时间】:2009-12-11 09:32:26
【问题描述】:
我所说的泛型是指您将一个类和一个 JSON 传递给一个方法,并且该方法根据类定义转换对象中的 JSON 数据。
我对概念性答案和 Objective-C 方法都感兴趣。
【问题讨论】:
标签: objective-c json parsing generics
我所说的泛型是指您将一个类和一个 JSON 传递给一个方法,并且该方法根据类定义转换对象中的 JSON 数据。
我对概念性答案和 Objective-C 方法都感兴趣。
【问题讨论】:
标签: objective-c json parsing generics
我假设使用通用解析器,您的意思是隐式 JSON 到对象的映射器。
在这种情况下,有一个挑战。取决于变量是否是 Objective-C 中的类型,这可能是可解决的,也可能是不可解决的(我不知道这实际上是一种耻辱)。虽然将 setter 方法名称(鉴于 Objective-C 确实提供反射)映射到 JSON 属性非常简单,但很难知道为嵌套的 JSON 对象创建哪个对象。所以你需要一种工厂来猜测嵌套对象的类型。如果 Objective-C 中的变量是类型,那可能会被用作提示,如果不是,你就得靠自己了。
【讨论】:
将数据放入 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 中,我不知道还有什么。当然可以,但我想项目维护者会接受你的代码,如果你写一些:)。
【讨论】:
您需要对传入的未处理的类以及我所看到的其他一些语言使用反射。
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,它需要知道哪个。如果沿着通用路径进行嵌套,则需要使用变量反射和一些智能来生成类型映射,否则需要为每个类进行硬编码。
编辑: 来看看
可能有用,也可能没用……
【讨论】:
嗯,从概念上讲,这种方法称为serialization/deserialization。不同之处在于您的序列化格式将是 JSON。实现:为您的类和 JSON 定义基本约定并实现它们。例如:每个 JSON 都应该有对应于类的 uniq-id。
我不熟悉 Objective-C,但如果我用其他语言这样做,我会假设 JSON 中的每个键都代表类的属性。这个属性可以通过像classInstance.setJsonAttribute(key, value);这样的函数来设置然后,我会写一些JSON解析器,它会遍历JSON,提取uniq-id,基于这个id创建类,并遍历所有其他key:values解析,设置它们setJsonAttribute 函数。我认为,这将是我实施的开始。
【讨论】:
对于可能看到这篇文章的其他人来说,这是可能的!碰巧有一些开源项目已经做得很好。结帐休息套件和
【讨论】:
我根本不知道 Objective-c,但我知道 JSON。
它是一种统一的数据交换格式,带有 RFC,因此您绝对可以使用自己的解析器。 Objective-c 支持泛型类型吗?如果是这样,您所寻找的将是可以实现的,并且我还猜测其他人已经准备好了。
【讨论】: