如何使用 NSJSONSerialization 从 JSON 对象中获取值
Posted
技术标签:
【中文标题】如何使用 NSJSONSerialization 从 JSON 对象中获取值【英文标题】:How to get a value from a JSON Object using NSJSONSerialization 【发布时间】:2013-10-14 14:58:27 【问题描述】:我可以检索 JSON 对象并显示它,但是如何从“lat”和“lng”中获取值以在 Xcode 中使用?
我的代码:
NSString *str=[NSString stringWithFormat:@"https://www.<WEBSITE>];
NSURL *url=[NSURL URLWithString:str];
NSData *data=[NSData dataWithContentsOfURL:url];
NSError *error=nil;
NSDictionary* dictionary = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
NSLog(@"Your JSON Object: %@ Or Error is: %@", dictionary, error);
JSON 对象:
(
response =
lat = "52.517681";
lng = "-115.113995";
;
)
我似乎无法访问任何数据。我试过了:
NSLog(@"Value : %@",[dictionary objectForKey:@"response"]);
我也尝试了很多变体,比如
NSLog(@"Value : %@",[[dictionary objectForKey:@"response"] objectForKey:@"lat"]);
但它总是以崩溃告终:
-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x15dd8b80
我在调试时注意到“字典”仅包含 1 个对象。如何将我的 JSON 对象转换为具有密钥对的 NSDictionary?这个 JSON 对象的格式是否错误?
【问题讨论】:
响应上面有key吗?如果您在该行上打断点并将鼠标悬停在 NSDictionary 对象上,您应该能够看到内容。 你看到了什么?它是一个包含一个元素的数组,其中包含一个名为“response”的条目的字典。该条目又是一个包含两个元素“lat”和“lng”的字典。 您的问题显然是您没有剥离阵列。 (你上面所说的“字典”是一个数组。) 字典 __NSCFArray * @"1 个对象" 0x145d4fd0 [0] 这是最常见的错误之一......您将对象分配给NSDictionary
的事实并不能使它成为字典。 @HotLicks 是对的,你的根对象是一个数组,你应该这样对待它。
【参考方案1】:
该特定 JSON 对象是 NSArray,而不是 NSDictionary,这就是它无法识别选择器的原因,并且您没有收到警告,因为 NSJSONSerialization JSONObjectWithData 返回一个 id。
试试
NSArray *array = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
NSDictionary *dictionary = array[0];
【讨论】:
@Hbombre 还注意到,在这些现代时代,我们通常喜欢使用括号表示法访问字典对象,例如dictionary[@"response"]
。它通常更容易阅读,但显然是一种风格选择,因此您不必遵守。【参考方案2】:
看来返回的 JSON 不是 NSDictionnary 对象,而是 NSArray。像这样更改您的代码:
NSarray *responseArray = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
responseArray 包含一个字典对象(或许多?),然后您可以像这样访问主题:
For ( NSDictionary *dic in responseArray)
NSDictionnary *response = [dic objectForKey@"response"];
....
【讨论】:
【参考方案3】:这是我编写的应用程序的片段...基本上是从响应中获取一个 NSData 对象,然后使用 NSJSONSerialization JSONObjectWithData:Options:Error 这将生成一个NSDictionary
NSError *error = nil;
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];
//Make sure response came in
if(response != nil)
NSError *error = nil;
id data = [NSJSONSerialization JSONObjectWithData:response options:0 error:&error];
if([data isKindOfClass:[NSDictionary class]])
//Create dictionary from all the wonderful things google provides
NSDictionary *results = data;
//Search JSON here
NSArray *cityAndState = [[[[results objectForKey:@"results"] objectAtIndex:0] objectForKey:@"address_components"] valueForKey:@"short_name"];
【讨论】:
如果您觉得这篇文章可以改进,请考虑发表评论。 对,它现在几乎看不见了。以上是关于如何使用 NSJSONSerialization 从 JSON 对象中获取值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用来自 NSString 的 NSJSONSerialization 解析 Json [重复]
如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据
如何让 NSJSONSerialization 将布尔值输出为真或假?