繁体   English   中英

如何在Objective-C中将JSON结构转换为对象?

[英]How do I convert a JSON structure to an object in Objective-C?

我有一个像这样的JSON结构:

{
  id:100
  contactInfo: {
    name: John Doe
    city: New York
  }
}

具有以下属性的相应Customer类,包括嵌套的contactInfo类。

Customer.id
Customer.contactInfo.name
Customer.contactInfo.city

是否可以将JSON数据直接转换为Customer类的实例?

我知道如何获取NSDictionary对象,但是使用起来非常麻烦且冗长,宁愿直接将数据转换/反序列化为Customer类。

带有附加信息的编辑:

在其他语言中,我使用内置的支持将JSON反序列化为自定义对象。 您要做的只是将类标记为“可序列化”,并且对JSON进行反序列化,而无需在每个类中编写自定义代码。

如果该类具有嵌套类,则NSDictionary对象可能会变得非常繁琐。 像这样使用自定义对象属性会容易得多

Customer.contactInfo.name

而不是

[(NSDictionary*)[customerDict objectForKey:@"contactInfo"] objectForKey:@"name"]

因此,我对Objective-C中的标准内置解串器的问题。

我不知道您为什么认为与您一起工作很麻烦。 一种简单的方法是为您的客户对象设置一个初始化程序,该初始化程序将字典作为参数。

这样,您可以将下载的数据以JSON格式获取,将其反序列化为字典,然后将其传递给初始化程序以从字典创建对象。

数十个JSON库中的任何一个都将解析您的JSON字符串,并将其转换为NSDictionary。 如果您不想自己编写解析器,则必须处理中间格式。 但是,一旦有了NSDictionary,就可以使用键值编码(KVC)来设置对象的属性:

for (NSString *key in jsonDictionary) {
    [customer setValue:[jsonDictionary objectForKey] forKey:key];
}

KVC内置在Cocoa中,并为所有对象定义setValue:forKey:因此您可以按名称设置属性,而不管它们如何定义。

您必须比上面的循环更聪明地处理内部ContactInfo类,但是您应该能够弄清楚这一点。 为了安全起见(因为JSON可能是通过网络setValue:forKeyPath: ),您可能需要制作一个密钥白名单并在其上循环,然后使用valueForKeyPath: / setValue:forKeyPath:处理嵌套对象。

考虑使用RestKit api(http://restkit.org/)及其对象映射系统...

这是一些维基: https : //github.com/RestKit/RestKit/wiki/Object-mapping

为您的Customer类编写一个初始化程序,该初始化程序将JSON数据作为参数,例如:

-(id)initWithJSONData:(NSData*)data;

您可以实现该方法来执行Abizern建议的操作:将数据读入词典,然后从词典中提取所需的任何值。

如果想花哨的话,另一种方法是在客户类中采用NSCoding,然后创建一个反序列化JSON数据的NSCoder子类。 这可以像NSKeyedUnarchiver一样工作。 除非您打算对许多类采用相同的方法,否则似乎不值得为此烦恼。

使用此 ,您可以执行以下操作:

SBJSON *parser = [[SBJSON alloc] init];
NSDictionary *customer = [parser objectWithString:jsonString];

然后,您可以使用以下方式访问您的媒体资源:

[customer objectForKey:@"id"];
[[customer objectForKey:@"contactInfo"] objectForKey:@"name"];
[[customer objectForKey:@"contactInfo"] objectForKey:@"city"];

然后,您可以在Customer类的init函数中使用此代码。 例如:

- (id)initWithJSON:(NSString *)jsonString {
    self = [super init]; // or whatever you need here
    if (self) {
        SBJSON *parser = [[SBJSON alloc] init];
        NSDictionary *customer = [parser objectWithString:jsonString];

        self.id = [customer objectForKey:@"id"];
        self.contactInfo = [[NSDictionary alloc] initWithObjectsAndKeys:[[customer objectforKey:@"contactInfo"] objectForKey:@"name"], @"name", [[customer objectforKey:@"contactInfo"] objectForKey:@"city"], @"city"]
    }
    return self;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM