2012-12-07 18 views
3

我从一个JSON文件中创建一个NSDictionary,但是当我尝试做什么是关键我的NSDictionary

NSString *key = [NSString stringWithFormat:@"%i",indexPath.row]; 
NSDictionary *currentObject = [JSONdata objectForKey:key]; 

我错误接收和-[__NSCFArray objectForKey:]: unrecognized selector sent to instance

错误,当我做的NSLogJSONdata这是我的输出:

(
    { 
     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; 
     }; 
    } 
) 

我是在想,第一组键,我应该能够得到应修正和2使用[JSONdata objectForKey:@"0"][JSONdata objectForKey:@"1"]?或者我错过了什么?

+2

但是,这是一个非常奇怪的JSON布局。你是否坚持这种布局,或者你打开一些更合理的结构?我个人会倾向于一个简单的字典数组,而不是一个字典数组,每个字典都有一个关键字(每个关键字不同),它们的价值是另一个字典(你大概想成为你的最终'currentObject' )。你可以编写代码来提取你想要的东西,但是你会扭曲自己做一些真正适合于一个更简单,更优雅结构的东西。 – Rob

+0

我同意Rob这是我见过的最奇怪的JSON。 –

+1

@Rob我更愿意重新格式化我的JSON。我通过PHP的'json_encode'创建它。给它一点帮助让它出来清洁将是伟大的。 – Jeremy1026

回答

3

您的JSON的结构如下

NSArray中含有的NSDictionary

所以,你需要这样做:在怀疑[[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"];

+1

我很确定这会抛出一个编译器错误在任何情况下,除非密钥是在一个包装类。 – John

+1

+1为编辑 – John

0

试试这个,

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]; 
0

这是一个非常奇怪的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]; 

最后,您cellForRowAtIndexPathdidSelectRowAtIndexPath现在只需简单地做:

NSDictionary *currentObject = jsonData[indexPath.row]; 

或者,如果您使用的是版本的Xcode 4.5相比之前的版本,您可以:

NSDictionary *currentObject = [jsonData objectAtIndex:indexPath.row]; 
+0

如果你有一个问题关于PHP生成这个JSON,提交另一个PHP标签的问题与你的PHP源代码并在这里添加评论的链接对于这个问题,所以我可以很容易地找到它。 – Rob