在 iOS 中,如何将 JSON 字符串解析为对象
Posted
技术标签:
【中文标题】在 iOS 中,如何将 JSON 字符串解析为对象【英文标题】:In iOS, how do I parse a JSON string into an object 【发布时间】:2013-12-04 12:08:30 【问题描述】:我来自 android 开发者,如果我在这里遗漏了明显的 ios 概念,非常抱歉。
我有一个如下所示的 JSON 提要:
"directory":["id":0,"fName":"...","lName":"...","title":"...","dept":"...","bld":"...","room":"...","email":"...","phone":"...","id":1,"fName":"...","lName":"...","title":"...","dept":"...","bld":"...","room":"...","email":"...","phone":"..."]
然后,我有一个 Staff.h 和 .m,其中有一个类具有匹配它的属性(id、fName、lName)等。
我已经为此工作了几个小时,但我似乎无法将 JSON 字符串解析为 Staff 对象数组。最终目标是让他们进入 Core Data,所以任何建议都会很好。
我读过的教程没有展示如何使用 "directory":[...] 形式的 JSON 字符串我在我的 Android 应用程序中这样做没有问题,但是我在 Objective-c 中,这里没有针对 iOS (6) 的想法。
感谢阅读。
【问题讨论】:
查看NSJSONSerialization
,了解如何将 JSON 反序列化为可从中获取数据的本机对象。
【参考方案1】:
你可以这样做
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];//response object is your response from server as NSData
if ([json isKindOfClass:[NSDictionary class]]) //Added instrospection as suggested in comment.
NSArray *yourStaffDictionaryArray = json[@"directory"];
if ([yourStaffDictionaryArray isKindOfClass:[NSArray class]])//Added instrospection as suggested in comment.
for (NSDictionary *dictionary in yourStaffDictionaryArray)
Staff *staff = [[Staff alloc] init];
staff.id = [[dictionary objectForKey:@"id"] integerValue];
staff.fname = [dictionary objectForKey:@"fName"];
staff.lname = [dictionary objectForKey:@"lName"];
//Do this for all property
[yourArray addObject:staff];
【讨论】:
正是我想要的,谢谢!我很困惑如何像第二行那样获取目录数组。 在第二行中,您也可以将所有其他人用作:dictionary[@"id"]
, dictionary[@"fName"]
.. 只是为了缩短代码。 并且总是在类型转换之前进行类内省/检查
@AnoopVaidya 请自省更新答案,我不知道。
jsonObjWithData 返回id
。因此我们应该使用if ([json isKindOfClass:[NSDictionary class]])
,然后进入循环。同样,在存储到数组之前,我们需要检查 objForKey/valueFK 是否返回一个数组。这是一种安全的编程,因为没有人知道有时你会从响应中得到不正确的数据并最终导致崩溃!!!【参考方案2】:
使用:NSJSONSerialization
您使用 NSJSONSerialization 类将 JSON 转换为 Foundation 对象并将 Foundation 对象转换为 JSON。
An object that may be converted to JSON must have the following properties: The top level object is an NSArray or NSDictionary. All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull. All dictionary keys are instances of NSString. Numbers are not NaN or infinity.
您将获得 NSDictionary,然后您可以将其解析(创建)为您的对象,然后在 CoreData 中使用它。
【讨论】:
【参考方案3】:使用以下代码:
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
这会将json数据转换为NSDictionary,类似于android上的hashmap。我想这会对你有所帮助。 :)
【讨论】:
【参考方案4】:您可以使用NSJSonSerialisation
或AFNetworking 库。这是AFNetworking解析json响应的例子
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"JSON: %@", responseObject);
NSDictionary *json = (NSDictionary *)responseObject;
NSArray *staffArray = json[@"directory"];
[staffArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop)
Staff *staff = [[Staff alloc] init];
staff.id = [[obj objectForKey:@"id"] integerValue];
staff.fname = [obj objectForKey:@"fName"];
staff.lname = [obj objectForKey:@"lName"];
//add data to new array to store details
[detailsArray addObect:staff);
];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
然后使用Core Data framework
来存储数据。
【讨论】:
【参考方案5】:我会看看RestKit。它提供对象映射和 CoreData 支持的存储。
【讨论】:
【参考方案6】:为此,您可以SBJSON框架。
您必须将响应字符串转换为 NSDictionary 之类的
NSString *responseString = [[NSString alloc]initWithData:responseData encoding:NSUTF8StringEncoding];
NSDictionary *dic = [responseString JSONValue];
现在您可以为 Staff 类创建一个对象。
Staff *staff = [[Staff alloc]init];
然后你可以像这样在这个对象中存储值
staff.firstname = [[[dic objectForKey:@"directory"] objectAtIndex:0] objectForKey:@"fName"];
现在您可以将这个单一对象传递给其他类
【讨论】:
【参考方案7】:你可以使用@janak-nirmal 提出的手工解决方案,或者使用jastor 之类的库,https://github.com/elado/jastor,没有太大区别。 我警告你不要使用 Restkit,因为在我看来,收益与痛苦的比率非常低。 此外,在您的场景中,它可能就像使用坦克杀死苍蝇一样。
【讨论】:
以上是关于在 iOS 中,如何将 JSON 字符串解析为对象的主要内容,如果未能解决你的问题,请参考以下文章