带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString
Posted
技术标签:
【中文标题】带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString【英文标题】:Nested NSDictionary with valueForKeyPath returns brackets instead of NSString 【发布时间】:2011-05-26 08:14:58 【问题描述】:来源是CouchDB中的JSON(相关数据):
"_id":"f994892f3fb525d73b3b6b8a59000e1d",
"_rev":"3-c431ee9334e9be038d9c935efcf2f049",
"teiXML":[
"teiHeader":[
"fileDesc":[
"publicationStmt":[
"publisher":"University",
"pubPlace":"Someplace",
"idno type=\"callNo\"":"ABC 007",
"date":"2007"
],
这是 NSDictionary(简化版):
<CCouchDBDocument: 0x5842c0> (id:f994892f3fb525d73b3b6b8a59000e1d rev:4-3fc1a36de622529cd67416c9e5ae88da
"_id" = f994892f3fb525d73b3b6b8a59000e1d;
"_rev" = "4-3fc1a36de622529cd67416c9e5ae88da";
teiXML = (
teiHeader = (
fileDesc = (
publicationStmt = (
date = 2007;
"idno type=\"callNo\"" = "ABC 007";
publisher = "University";
我想获取“publisher”的值,所以我尝试使用 valueForKeyPath:
NSLog(@"%@",[doc valueForKeyPath:@"content.teiXML.teiHeader.fileDesc.publicationStmt.publisher"]);
但我得到的不是“大学”值,而是输出:
1> 2011-05-26 10:10:02.717 MyApp[12770:707] (
(
(
(
"University"
)
)
)
)
这很烦人。我可以使用 indexAtObject 组合获取值:
NSLog(@"%@",[[[[[doc valueForKeyPath:@"content.teiXML.teiHeader.fileDesc.publicationStmt.publisher"] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0]);
那里一定有什么问题吗?还有更多值要提取,我不想计算需要多少 objectAtIndex-repetitions 才能使其工作。
【问题讨论】:
【参考方案1】:您提到了“xml”标签,所以我想您的NSDictionary
是由一些 XML 数据构建的。在这种情况下,可以解释这种行为的一个假设是您的 XML 包含重复的键,例如:
<values>
<value>
......
</value>
<value>
......
</value>
...
</values>
确实,示例中的重复值不适合通过键值编码处理,内部处理为NSArray
s。现在,我很难弄清楚为什么你的回复中有这么多嵌套数组的实际细节,但这可以让你知道发生了什么。
如果此假设不适用于您的案例,请分享您构建 NSDictionary 的方式。
编辑:查看您的 JSON 后,有些东西对我来说并不明显。看看这个:
"publicationStmt":[
"publisher":"University",
"pubPlace":"Someplace",
"idno type=\"callNo\"":"ABC 007",
"date":"2007"
],
我的理解是您有嵌套数组:plublicationStmt 包含一个数组 ([),而该数组又包含另一个(键控)数组 ()...
这可能会产生您的结果吗?
【讨论】:
抱歉,我将 CouchDB 的 XML 转换为 JSON,因此 NSDictionary 是从 JSON 源构建的,而不是 XML。我会将 JSON 源添加到问题中。 正如预期的那样,输出是一个 NSArray:(gdb) po items <__NSArrayI 0x53fcf0>( <__NSArrayI 0x54d4c0>( <__NSArrayI 0x55dc10>( <__NSArrayI 0x554280>( University ) ) ) )
。我真的很想知道为什么?
谢谢塞尔吉奥。但是,如果我删除大括号 ,则 JSON 将不再有效。还有另一种嵌套属性的方法吗?如果我正确指定了值的路径,为什么它会返回一个数组?
好的,我刚刚查找了一个示例 JSON 数据集。我必须删除括号 [],因为文件中存储的数组并不多。希望能解决问题。谢谢!以上是关于带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString的主要内容,如果未能解决你的问题,请参考以下文章