带有 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>

确实,示例中的重复值不适合通过键值编码处理,内部处理为NSArrays。现在,我很难弄清楚为什么你的回复中有这么多嵌套数组的实际细节,但这可以让你知道发生了什么。

如果此假设不适用于您的案例,请分享您构建 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 &lt;__NSArrayI 0x53fcf0&gt;( &lt;__NSArrayI 0x54d4c0&gt;( &lt;__NSArrayI 0x55dc10&gt;( &lt;__NSArrayI 0x554280&gt;( University ) ) ) )。我真的很想知道为什么? 谢谢塞尔吉奥。但是,如果我删除大括号 ,则 JSON 将不再有效。还有另一种嵌套属性的方法吗?如果我正确指定了值的路径,为什么它会返回一个数组? 好的,我刚刚查找了一个示例 JSON 数据集。我必须删除括号 [],因为文件中存储的数组并不多。希望能解决问题。谢谢!

以上是关于带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString的主要内容,如果未能解决你的问题,请参考以下文章

valueForKeyPath常用用法

KVC

ValueForKeyPath() 返回意外的东西

妙用valueForKeyPath

valueForKeyPath

嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃