【问题标题】:What is the key for my NSDictionary我的 NSDictionary 的密钥是什么
【发布时间】:2023-03-14 14:00:05
【问题描述】:

我已经从 JSON 文件创建了一个 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;
        };
    }
)

我认为我应该能够使用[JSONdata objectForKey:@"0"][JSONdata objectForKey:@"1"] 获得的第一组密钥应该是12 是否更正?还是我错过了什么?

【问题讨论】:

  • 但这是一个非常奇怪的 JSON 布局。你是坚持这种布局还是对一些更合乎逻辑的结构持开放态度?我个人倾向于一个简单的字典数组,而不是一个字典数组,其中每个字典都有一个键(每个键都不同),它的值是另一个字典(你可能想成为你的最后一个 currentObject )。你可以编写代码来提取你想要的东西,但你会扭曲自己来做一些真正适合于更简单、更优雅的结构的事情。
  • 我同意 Rob 的观点,这是我见过的最奇怪的 JSON。
  • @Rob 我非常愿意重新格式化我的 JSON。我通过 PHP 的json_encode 创建它。给它一点帮助让它变得更干净会很棒。
  • @Jeremy1026 请参阅下面的answer,其中我向您展示了生成简化 JSON 的 PHP 代码,然后向您展示了在清理 JSON 后生成的 Objective-C 是多么简单。

标签: objective-c ios json nsdictionary


【解决方案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];
      

      最后,你的cellForRowAtIndexPathdidSelectRowAtIndexPath 现在可以简单地做:

      NSDictionary *currentObject = jsonData[indexPath.row];
      

      或者,如果您使用的 Xcode 版本早于 4.5 版,您会:

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

      【讨论】:

      • 如果您对生成此 JSON 的 PHP 有疑问,请使用您的 PHP 源提交另一个带有 PHP 标记的问题,并在此处添加带有该问题链接的评论,以便我可以轻松找到它。
      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2018-11-29
      • 2016-07-17
      • 2021-12-25
      • 1970-01-01
      • 2016-09-10
      • 2017-08-09
      相关资源
      最近更新 更多