将 JSON 嵌套到核心数据和 ObjectForKey 错误

Posted

技术标签:

【中文标题】将 JSON 嵌套到核心数据和 ObjectForKey 错误【英文标题】:Nested JSON to Core Data and ObjectForKey Error 【发布时间】:2013-02-08 17:20:42 【问题描述】:

我有两个问题: 我需要从下面的 JSON 中获取“元素”和“类别”到我的核心数据持久存储/数据库中,我尝试了以下(下面的代码),但我对我是否做对了感到困惑和困惑怎么办?

当我尝试使用嵌套的 objectForKey 获取元素数组时,我也遇到了错误,为什么以及如何解决它?

错误,我不明白,因为 Elements 是一个数组?

   reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1cd2f4a0'

我收到带有 AFNetworking 的 JSON,如下所示:

         [[MyAPIClient sharedClient] getPath:domain parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) 

//IS THIS THE RIGHT WAY TO PROCESS NESTED JSON DATA IN CORE DATA? 

            NSError *error;
            NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:JSON options:0 error:&error];

            NSArray *arrayOfCategoriDictionaries = (NSArray *)[[jsonDict objectForKey:@"Manifacture"] objectForKey:@"Categori"];


        //Categori array to Core data
            for( NSDictionary *d  in arrayOfCategoriDictionaries) 
               Categori *cat = [NSEntityDescription insertNewObjectForEntityForName:@"Categori" inManagedObjectContext:_managedObjectContext];


            

    //Elements to core data, get an error with objectForKey:@"Elements" ?         

            NSArray *arrayOfElementsDictionaries = [[[jsonDict objectForKey:@"Manifacture"] objectForKey:@"Categori"] objectForKey:@"Elements"];



            for(NSDictionary *d1 in arrayOfRetDictionaries) 
                Elements *elements = [NSEntityDescription insertNewObjectForEntityForName:@"Elements" inManagedObjectContext:_managedObjectContext];

            






         failure:^(AFHTTPRequestOperation *operation, NSError *error) 


            if (![_managedObjectContext save:&error]) 
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            





        ];

嵌套的json数据:

   
  "Manifacture": 
    "Categori": [
      
        "Elements": [
          
            "Id": 1,
            "Name": "Door",
            "Description": "Black door with window",
            "Price": 149,
            "CategoriId": 1
          
        ],
        "Id": 1,
        "Name": "Forret",
        "ElementsId": 1,
        "Manifacture_Id": 1
      
    ],
    "CarSet": [],
    "Id": 1,
    "Name": "Hummer",
    "Description": "A big car"
  ,
  "Id": 2,
  "Name": "Hummer Car Factory",
  "Contactperson": "Adil Bujas",
  "Location": "California",
  "Info": "Hummer LTD",
  "SearchThumbnail": "none",
  "CarPicture": "none",
  "Doors": 5,
  "webpages_MembershipUserId": 4,
  "Manifacture_Id": 1

提前感谢您的帮助。

【问题讨论】:

请解释投票否决? 这个问题会被反复问多少次?为什么人们不去看看他们该死的 JSON 的结构和/或谷歌错误消息? 我有,但由于我是初学者,我对这门语言以及它与我的 JSON 的关系还没有全面的了解,我只是想问问有这方面知识的人。而且由于之前已经被问过很多次,它似乎真的很相关。如果您不喜欢它或不分享您的知识,请忽略这个问题,而不是写这样的评论。 【参考方案1】:

我不确定NSJSONSerialization 是否属于这种情况。我已经看到某些 JSON 类返回只有 1 对象所在的数组,作为该对象本身。

它应该让你更容易,但它通常会让你更难,因为你期望一个有 1 个对象的 NSArray,但你得到的是数组第一个对象的 NSDictionary。

如果你这样做会发生什么:

NSLog(@"%@", [[[jsonDict objectForKey:@"Manifacture"] objectForKey:@"Categori"] objectForKey:@"Elements"] class]);

编辑:

啊,如果你仔细看看你的 JSON,你会注意到键 Categori 也包含一个 NSArray,但你把它当作它包含一个字典。这可能就是您的错误发生的地方。

【讨论】:

您好,非常感谢您的回答。我得到同样的错误:原因:'-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1cd2f4a0' 如果我运行 NSLog 稍微更新了我的答案,那里还有另一个偷偷摸摸的数组;)【参考方案2】:

尝试删除强制转换并拆分语句以隔离任何问题:

NSDictionary *manifactureDict = [jsonDict objectForKey:@"Manifacture"];
NSArray *arrayOfCategoriDictionaries = [manifactureDict objectForKey:@"Categori"];

或者尝试将内部对象转换为字典:

NSArray *arrayOfCategoriDictionaries = [(NSDictionary*)[jsonDict objectForKey:@"Manifacture"] objectForKey:@"Categori"];

【讨论】:

铸造不会改变任何东西。 Objective-C 是动态的。【参考方案3】:

自己找到了解决方案。

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:JSON options:0 error:&error];

        NSDictionary *theDict = [jsonDict objectForKey:@"Manifacture"];

            NSArray *categoriArray = [theDict objectForKey:@"Categori"];

            for (NSDictionary *aDictionary in categoriArray) 
            NSDictionary *arrayOfElementsDictionaries = [aDictionary objectForKey:@"Elements"];

    

无论如何,感谢您的帮助。

【讨论】:

谢谢,您的答案已被检查:)

以上是关于将 JSON 嵌套到核心数据和 ObjectForKey 错误的主要内容,如果未能解决你的问题,请参考以下文章

将嵌套的键/值和嵌套列表合并到 json

将嵌套 JSON 数据发送到服务器的可能方法 - extjs 4.2.x

将嵌套的 JSON 数据列出到表视图

Python - 将字段和标签添加到嵌套的 json 文件

在核心数据中保存动态生成的带有父->子关系的JSON数据?

将 JSON 数据嵌套到 Datatable 中不起作用