2015-03-07 5 views
-2

Пытается разобрать вложенный json. Попытка захватить содержимое внутри вложенного json-файла. Появляется множество словарей. Внутри этого мы хотим иметь поле со словарным содержанием (сообщениями). Тогда внутри этого custom_fields, который является массивом массива.Как разобрать вложенный JSON из URL?

///////////// ViewController.h ////////// 
@property (nonatomic, strong) NSMutableArray *jsonArray;  
@property (nonatomic, strong) NSMutableArray *postArray; 
@property (nonatomic, strong) NSMutableDictionary *fieldArray; 
@property (nonatomic, strong) NSMutableArray *testArray; 

- (void) retrieveData; 

@end 




///////////////// ViewController.m ////////////////// 

#import "ViewController.h" 
#import "Model.h" 

@interface ViewController() 

@end 

@implementation ViewController 
@synthesize jsonArray, postArray, fieldArray, testArray; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Set title of VC 
    self.title = @"SF"; 

    //Load data 
    [self retrieveData]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:  (NSInteger)section { 
    // Return the number of rows in the section. 
    return fieldArray.count; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    //Configure cell: 
    Model * modelObject = [[Model alloc] init]; 
    modelObject = [fieldArray objectAtIndex:indexPath.row]; 
    cell.tag = indexPath.row; 
    cell.textLabel.text = modelObject.address; 
    NSLog(@"the text is %@", modelObject.address); 

    //Accessory 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 

- (void) retrieveData 
{ 
    NSURL * url = [NSURL URLWithString:getDataURL]; 
    NSData * data = [NSData dataWithContentsOfURL:url]; 

    jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 

    //Set up arrays 
    postArray = [[NSMutableArray alloc] init]; 
    fieldArray = [[NSMutableDictionary alloc] init]; 
    testArray = [[NSMutableArray alloc] init]; 

    NSLog(@"old post class: %@", NSStringFromClass([postArray class])); 
    NSLog(@"old field class: %@", NSStringFromClass([fieldArray class])); 
    NSLog(@"old test class: %@", NSStringFromClass([testArray class])); 

    //Set up array from jsonArray 
    postArray = [jsonArray valueForKey:@"posts"]; 
    fieldArray = [postArray valueForKey:@"custom_fields"]; 

    NSLog(@"new post class: %@", NSStringFromClass([postArray class])); 
    NSLog(@"new field class: %@", NSStringFromClass([fieldArray class])); 
    NSLog(@"new test class: %@", NSStringFromClass([testArray class])); 

    NSLog(@"Test Array: %@", fieldArray); 

    //Set up json array 
    for (int i = 0; i < fieldArray.count; i++) 
    { 
     //Create object 
     NSString * name = [[fieldArray valueForKey:@"cf_name"] objectAtIndex:i]; 
     //NSLog(@"name: %@", name); 

     NSString * address = [[fieldArray valueForKey:@"cf_Address"] objectAtIndex:i]; 
     //NSLog(@"address: %@", address); 

     NSString * contact = [[fieldArray valueForKey:@"cf_contact"] objectAtIndex:i]; 
     //NSLog(@"contact: %@", contact); 
    } 

    //Reload table view 
    [self.tableView reloadData]; 
} 

@end 
+0

Возможный дубликат [Как отлаживать «непризнанный селектор, отправленный на экземпляр») (http://stackoverflow.com/questions/25853947/how-can-i-debug-unrecognized-selector-sent-to-instance -error) –

+0

Если ваша ссылка на данные должна считаться, самая внешняя структура JSON - это объект, а не массив. Кроме того, он не изменен, поскольку вы не указали для него параметр синтаксического анализа. Однако содержимое «posts» * - это * массив, и использование 'valueForKey' на нем возвращает массив значений« custom_fields », где каждое отдельное значение является NSDictionary. При запросе элемента «cf_Business_name» для n-й записи массива «custom_fields» будет возвращен NSArray, обычно содержащий одно имя. То есть, как вы думаете, NSString - это NSArray, как ясно говорит вам исключение. –

+0

Вам действительно нужно очистить этот беспорядок, выделить, какие вещи являются массивами и которые являются словарями. И вы вызываете много потерянного движения (и путаницы) с помощью 'valueForKey' и его родственников, а также отделяя JSON более традиционным способом. –

ответ

0

Проблема в том, что касается ошибки. Вы пытаетесь вызвать isEqualToString: на NSArray, что вызывает сбой. Я не уверен, где именно вы делаете сравнение, но это происходит. Вероятно, это связано с тем, что вы используете valueForKey:, когда вы разбираете JSON вместо objectForKey:.

+0

Я раньше пробовал objectForKey, но это дает мне «objectForKey, возможно, не работает с postArray», и «objectForKey может не работать с fieldArray». I – Kevin

+0

Использование 'valueForKey' будет возвращать массив при использовании в массиве словарей (что имеет место в большинстве применений выше). Это полезная функция, если вы ее понимаете, но очень сбиваете с толку, если вы этого не сделаете. –

0

Это было сложно. Я должен поблагодарить Hot Licks!

postVal = valueForKey на JSONData превратил выход в массив.

Чем я перебирать массив словарей следующим

for (NSMutableDictionary *postDict in postVal) {} 

Within, что я хотел поле в словаре. Поэтому я использовал следующее:

id key; 
while((key = [enumerator nextObject])) {} 

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

NSString * bName = [fieldVal objectForKey:key][0]; 

Тип наконец NSString !!!!!!!

спасибо.

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