带有valueForKeyPath的嵌套NSDictionary返回括号而不是NSString

时间:2011-05-26 08:14:59

标签: objective-c ios json couchdb nsdictionary

Source是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-combination获取值:

NSLog(@"%@",[[[[[doc valueForKeyPath:@"content.teiXML.teiHeader.fileDesc.publicationStmt.publisher"] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0] objectAtIndex:0]);

那里肯定有问题吗?有更多值要提取,我不想计算我需要多少个objectAtIndex重复才能使它工作。

1 个答案:

答案 0 :(得分:4)

您提到的是“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包含一个数组([),它包含另一个(键控)数组({)...

这可能会产生你的结果吗?