2013-02-08 2 views
-3

У меня есть 2 вопроса: Мне нужно получить «Элементы» & «Categori» от JSON ниже, в моем основном хранилище данных/базе данных, я пробовал следующее (код ниже), но я застрял и смущен, если я делаю это правильно?Вложенные данные JSON для Core Data и ObjectForKey

А также я получаю сообщение об ошибке, когда пытаюсь получить массив элементов с вложенным объектомForKey, почему и как его исправить?

Ошибка, которую я не понимаю, поскольку Elements - это массив?

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

Я получаю JSON с AFNetworking так:

  [[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 
} 

Спасибо за помощь заранее.

+0

Пожалуйста, объясните, пожалуйста, проголосовать? – 7c9d6b001a87e497d6b96fbd4c6fdf

+2

Сколько раз этот вопрос будет задан снова и снова? Почему люди просто чертовски смотрят на структуру своего проклятого JSON и/или google сообщение об ошибке? – 2013-02-09 07:37:55

+0

У меня есть, но так как я новичок, у меня нет общего понимания языка и того, как оно относится к моему JSON, я просто хотел спросить кого-нибудь, у кого есть это знание. И поскольку это было задано много раз раньше, это, по-видимому, действительно актуально. Просто игнорируйте вопрос, если вам это не нравится или делитесь своими знаниями, вместо того, чтобы писать такой комментарий. – 7c9d6b001a87e497d6b96fbd4c6fdf

ответ

1

Я не уверен, что это в случае с NSJSONSerialization. Я видел, что некоторые классы JSON возвращают массивы, где только объект находится, как и сам этот объект.

Предполагается, что вам будет проще, но это усложняет вас, потому что вы ожидаете NSArray с 1 объектом, но вместо этого вы получаете NSDictionary первого объекта массива.

Что произойдет, если вы:

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

EDIT:

Ах, если взять лучше посмотреть на ваш JSON, вы заметите, что ключ Categori также содержит NSArray, но вы так как он содержит словарь. Вероятно, это происходит с вашей ошибкой.

+0

Привет большое спасибо за ответ. Я получаю ту же ошибку: reason: '- [__ NSCFArray objectForKey:]: нераспознанный селектор, отправленный в экземпляр 0x1cd2f4a0', если я запустил этот NSLog – 7c9d6b001a87e497d6b96fbd4c6fdf

+0

Обновил свой ответ, там есть еще один подлый массив;) –

0

Try удаления актеров и дробя заявление, чтобы выделить какой-либо вопрос:

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

Или, возможно, попробовать заливкой внутренний объект в словаре:

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

Кастинг ничего не меняет ,Объектив-C является динамическим. – 2013-02-09 07:38:37

0

Найдено решение сам.

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

    } 

Благодарим за помощь в любом случае.

+0

Thats точно мой ответ там .. –

+0

Спасибо, ваш ответ проверен :) – 7c9d6b001a87e497d6b96fbd4c6fdf

Смежные вопросы