我的 NSDictionary 的密钥是啥
Posted
技术标签:
【中文标题】我的 NSDictionary 的密钥是啥【英文标题】:What is the key for my NSDictionary我的 NSDictionary 的密钥是什么 【发布时间】:2012-12-07 04:34:39 【问题描述】:我已经从 JSON 文件创建了一个 NSDictionary,但是当我尝试这样做时
NSString *key = [NSString stringWithFormat:@"%i",indexPath.row];
NSDictionary *currentObject = [JSONdata objectForKey:key];
我错误接收和-[__NSCFArray objectForKey:]: unrecognized selector sent to instance
错误
当我执行NSLog
或JSONdata
时,这是我的输出:
(
1 =
description = "";
facets = (
name = Red;
,
name = Blue;
,
name = Skinny;
,
name = Standard;
,
name = "Navy Blue";
);
id = 1073;
owner = 1001;
"post_date" = 1341980987;
transaction = 24;
username = TonyB;
;
,
2 =
description = "";
facets = (
name = "Bow Tie";
,
name = Blue;
,
name = Orange;
,
name = Yellow;
);
id = 1001;
owner = 1001;
"post_date" = 1340640012;
transaction = 6;
username = TonyB;
;
)
我认为我应该能够使用[JSONdata objectForKey:@"0"]
或[JSONdata objectForKey:@"1"]
获得的第一组密钥应该是1
和2
是否更正?还是我错过了什么?
【问题讨论】:
但这是一个非常奇怪的 JSON 布局。你是坚持这种布局还是对一些更合乎逻辑的结构持开放态度?我个人倾向于一个简单的字典数组,而不是一个字典数组,其中每个字典都有一个键(每个键都不同),它的值是另一个字典(你可能想成为你的最后一个currentObject
)。你可以编写代码来提取你想要的东西,但你会扭曲自己来做一些真正适合于更简单、更优雅的结构的事情。
我同意 Rob 的观点,这是我见过的最奇怪的 JSON。
@Rob 我非常愿意重新格式化我的 JSON。我通过 php 的json_encode
创建它。给它一点帮助让它变得更干净会很棒。
@Jeremy1026 请参阅下面的answer,其中我向您展示了生成简化 JSON 的 PHP 代码,然后向您展示了在清理 JSON 后生成的 Objective-C 是多么简单。
【参考方案1】:
您的 JSON 结构如下所示
包含 NSDictionary 的 NSArray
所以你需要这样做:[[JSONdata objectAtIndex:0] objectForKey:@"1"]
如果有疑问,您可以随时这样做:NSLog(@"JSONdata class == %@", [JSONdata class]);
当你点击NSDictionary 时,你总是有这个方法:- (NSArray *)allKeys
,它将返回一个包含该字典所有键的数组。
【讨论】:
【参考方案2】:你有NSArray
,然后是NSDictionary
。另外,您将key
作为NSString
发送,因为它是json 中的int
。会这样吗?
这有帮助吗[[JSONdata objectAtIndex:0] objectForKey:@"1"];
【讨论】:
我很确定这在任何情况下都会引发编译器错误,除非密钥在包装类中。【参考方案3】:试试这个,
NSArray *currentObject = [JSONdata valueForKey:key];
您的 JSONdata 是一个数组而不是字典。所以没有任何objectForKey
方法。上面的将调用valueForKey
on its objects 并将结果作为数组返回。如果只想访问第一个对象,也可以直接使用[[JSONdata objectAtIndex:0] objectForKey:key];
。如果使用上述的,只需使用
NSDictionary *currentDict = [currentObject objectAtIndex:0];
理想情况下,一个简单的解决方案应该是这样的,
NSString *key = [NSString stringWithFormat:@"%i",indexPath.row];
NSDictionary *currentObject = [[JSONdata objectAtIndex:(indexPath.row - 1)] valueForKey:key];
【讨论】:
【参考方案4】:这是一个非常奇怪的 JSON 布局。这是一个字典数组,其中每个字典都有一个键(每个键都不同),其对象是字典。我建议一个简单的字典数组。
因此,您可能拥有以下 PHP。我假设您正在从数据库或其他东西中读取数据,但它会让您了解我建议的 JSON 结构,这只是一个字典数组。我也简化了facets
,但是你是否能走那么远取决于你。但关键问题是 PHP 只是生成了一个简单的字典数组:
<?php
$object1 = array(
"description" => "",
"facets" => array (
"Red",
"Blue",
"Skinny",
"Standard",
"Navy Blue"
),
"id" => 1073,
"owner" => 1001,
"post_date" => 1341980987,
"transaction" => 24,
"username" => "TonyB");
$object2 = array(
"description" => "",
"facets" => array (
"Bow tie",
"Blue",
"Orange",
"Yellow"
),
"id" => 1071,
"owner" => 1001,
"post_date" => 1340640012,
"transaction" => 6,
"username" => "TonyB");
$results = array($object1, $object2);
echo json_encode($results);
?>
这将生成以下 JSON(我已对其进行了美化):
[
"description" : "",
"facets" : [
"Red",
"Blue",
"Skinny",
"Standard",
"Navy Blue"
],
"id" : 1073,
"owner" : 1001,
"post_date" : 1341980987,
"transaction" : 24,
"username" : "TonyB"
,
"description" : "",
"facets" : [
"Bow tie",
"Blue",
"Orange",
"Yellow"
],
"id" : 1071,
"owner" : 1001,
"post_date" : 1340640012,
"transaction" : 6,
"username" : "TonyB"
]
然后您可以以标准方式读取此 JSON:
NSData *data = [NSData dataWithContentsOfURL:url];
NSError *error;
NSArray *jsonData = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
最后,你的cellForRowAtIndexPath
或didSelectRowAtIndexPath
现在可以简单地做:
NSDictionary *currentObject = jsonData[indexPath.row];
或者,如果您使用的 Xcode 版本早于 4.5 版,您会:
NSDictionary *currentObject = [jsonData objectAtIndex:indexPath.row];
【讨论】:
如果您对生成此 JSON 的 PHP 有疑问,请使用您的 PHP 源提交另一个带有 PHP 标记的问题,并在此处添加带有该问题链接的评论,以便我可以轻松找到它。以上是关于我的 NSDictionary 的密钥是啥的主要内容,如果未能解决你的问题,请参考以下文章
如何修复错误无法将 [NSDictionary] 快速转换为 NSDictionary?
NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”