2015-06-16 1 views
3

Я недавно перешел на iPhone, в основном в моем приложении. Я разбираюсь под моделью JSON и должен сохранить его в своем обычном классе Entity.Получение ошибки в анализе JSON с массивом в iOS

JSON модель:

{ 
    "Products": [ 
     { 
      "Pcs": [ 
       { 
        "product_id": 2, 
        "product_name": "MyProduct", 
        "category": { 
         "Clamshells": [ 
          { 
           "product_category_id": 11, 
           "product_category_name": "MyProductCategory", 
           "Sub_category": [ 
            { 
             "sub_category_id": 21, 
             "sub_category_name": "MyProductSubCategory" 
            } 
           ] 
          } 
         ], 
         "Detachables": [ 
          { 
           "product_category_id": 12, 
           "product_category_name": "MyProductCatrgory1", 
           "Sub_category": [ 
            { 
             "sub_category_id": 31, 
             "sub_category_name": "MyProductSubCategory1" 
            } 
           ] 
          } 
         ], 
         "Convertibles": [ 
          { 
           "product_category_id": 13, 
           "product_category_name": "MyProductCatrgory2", 
           "Sub_category": [ 
            { 
             "sub_category_id": 41, 
             "sub_category_name": "MyProductSubCategory2" 
            } 
           ] 
          } 
         ] 
        } 
       } 
      ] 
     } 
    ] 
} 

Я создал три класса объектов, как:

PCs.h:

#import <Foundation/Foundation.h> 
#import "MyProductCategory.h" 

@interface PCs : NSObject 

@property (nonatomic, retain) NSString *productTitle; 
@property (nonatomic, retain) NSString *productId; 
@property (nonatomic, retain) MyProductCategory *myProductCategory; 

@end 

MyProductCategory.h:

#import <Foundation/Foundation.h> 
#import "Clamshell.h" 

@interface MyProductCategory : NSObject 

@property (nonatomic, retain) Clamshell *clamshell; 
@property (nonatomic, retain) NSMutableArray *arrayClamshells; 
@property (nonatomic, retain) NSMutableArray *arrayConvertibles; 
@property (nonatomic, retain) NSMutableArray *arrayDetachables; 

@end 

раскладушка. h:

#import <Foundation/Foundation.h> 

@interface Clamshell : NSObject<NSCoding> 

@property (nonatomic, retain) NSString *subProductTitle; 
@property (nonatomic, retain) NSString *subProductId; 

@end 

Вот мой код для синтаксического анализа данных:

NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData 
                    options:kNilOptions 
                     error:&error]; 


       productsDict = [json objectForKey:@"Products"]; 

       pcsArray = [[NSMutableArray alloc] init]; 

    dispatch_async (dispatch_get_main_queue(), 
          ^{ 
           for (NSDictionary *items in productsDict) 
           { 
            NSDictionary *pcsDict = [items objectForKey:@"Pcs"]; 

            for (NSDictionary *item1 in pcsDict) { 

             PCs *pcs = [[PCs alloc] init]; 
             pcs.productId = [item1 objectForKey:@"product_id"]; 
             pcs.productTitle = [item1 objectForKey:@"product_name"]; 

             //for the category            
              pcs.myProductCategory = [[MyProductCategory alloc] init]; 
              pcs.myProductCategory = [item1 objectForKey:@"category"]; 

              NSMutableArray *clamshellDict = [pcs.myProductCategory valueForKey:@"Clamshells"]; 


              NSMutableArray *array = [[NSMutableArray alloc]init]; 

              for (NSDictionary *items2 in clamshellDict) { 
               Clamshell *clam = [[Clamshell alloc] init]; 
               clam.subProductId = [items2 objectForKey:@"sub_category_id"]; 
               clam.subProductTitle = [items2 objectForKey:@"sub_category_name"]; 

               [array addObject:clam];// 
              } 

              pcs.myProductCategory.arrayClamshells = [NSMutableArray alloc] init]; //here it is crashing 

pcs.myProductCategory.arrayClamshells = [array copy]; 
             } 

             [pcsArray addObject:pcs]; 
            } 

            NSLog(@"PCs array is = %@", pcsArray); 
           } 

          }); 

Но это происходит сбой, когда я инициализации массива или установить любое значение для него. сообщение об ошибке:

-[__NSCFDictionary setArrayClamshells:]: unrecognized selector sent to instance 0x7f8f16059730 

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setArrayClamshells:]: unrecognized selector sent to instance 0x7f8f16059730' 
+0

Где метод setArrayClamshells? – Rajesh

+0

@iDev Это просто метод setter по умолчанию, который вызывается, когда '.arrayClamshells =' is. – rebello95

+0

да кажется, объект object.array или objectArray –

ответ

2

Ваш код здесь

pcs.myProductCategory = [[MyProductCategory alloc] init]; 
pcs.myProductCategory = [item1 objectForKey:@"category"]; 

Правильно ли создать свой MyProductCategory экземпляр, но затем заменить его со словарем. Вы, вероятно, намеревался написать вторую линию как

NSDictionary *category = [item1 objectForKey:@"category"]; 

И затем использовать его в следующей строке для распаковки словаря содержание

+0

Спасибо @Wain за ваш ответ. –

2

Ошибка в том, что у вас есть линия, которая должным образом инициализирует myProductCategory в качестве пользовательского объекта:

pcs.myProductCategory = [[MyProductCategory alloc] init]; 

Но в следующей строке, вы сбрасываете, что и установить его быть в словаре указано category запись:

pcs.myProductCategory = [item1 objectForKey:@"category"]; 

Таким образом, когда вы получаете на следующую строку, то крах будет, клюв не AUSE myProductCategory больше не MyProductCategory, а скорее NSDictionary:

pcs.myProductCategory.arrayClamshells = [NSMutableArray alloc] init]; 
+0

Спасибо alot @Rob .. теперь он работает, +1 для предложения. –

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