2016-03-14 2 views
0
{ 
    "bidstatus":[ 
     {"bidstatusid":"1","bidstatus":"Quoted"}, 
     {"bidstatusid":"2","bidstatus":"Closed"}, 
     {"bidstatusid":"3","bidstatus":"Awarded"} 
     ], 
    "config":{ 
     "adminfee":"100", 
     "percentcommission":"10", 
     "premiumfee":"0" 
     }, 
    "lvlsubj":{ 
     "Primary 1":["English","Geography","Maths","Science"], 
     "Primary 2":["English","Geography","History"], 
     "Primary 3":["Maths","Science"] 
     } 
} 

У меня есть входящий ответ JSON от API, который возвращает выше. Существующий код iOS использует AFNetworking для анализа JSON. Я могу хранить bidstatus как NSArray и config как NSDictionary. Тем не менее, я не могу заставить lvlsubj правильно храниться. Этот объект выглядит как 2D-массив с массивом второго уровня переменного размера.Хранение массива JSON с переменным размером в элементе iOS

Как это сделать?

Существующий код довольно прост.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSString* strRequestLink = [NSString stringWithFormat:@"%@%@", SERVICEPATH, @"get_var.php"]; 
[manager GET: strRequestLink 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
     [GlobalPool sharedObject].m_dictPaymentConfig = [[responseObject valueForKey:@"config"] mutableCopy]; 
     [GlobalPool sharedObject].m_arrayBidStatus = [[responseObject valueForKey:@"bidstatus"] mutableCopy]; 
     //[GlobalPool sharedObject].m_arrayLevelSubject = [[responseObject valueForKey:@"lvlsubj"] mutableCopy]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 

     [self showServerConnectionError]; 
    }]; 
+0

lvlsubj - словарь с первичным 1 в качестве первого ключа, который представляет собой массив. то же, что и вы, с состоянием ставки, сделать это с первичным 1 и так далее, после извлечения из lvlsubj. –

+1

Похож, что 'lvlsubj' является' NSDictionary' 'NSArrays'. Поэтому вызов '[lvlsubj objectForKey" "]' будет возвращать массив. Извините, на моем телефоне или прокомментирую как ответ, но не смог правильно протестировать. – random

+0

Спасибо обе, попробуем. – Terence

ответ

0

Благодаря приведенным выше предложениям мне удалось их сохранить и прочитать.

Сохраните его как NSDictionary.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSString* strRequestLink = [NSString stringWithFormat:@"%@%@", SERVICEPATH, @"get_var.php"]; 
[manager GET: strRequestLink 
    parameters:nil 
    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
     [GlobalPool sharedObject].m_dictPaymentConfig = [[responseObject valueForKey:@"config"] mutableCopy]; 
     [GlobalPool sharedObject].m_arrayBidStatus = [[responseObject valueForKey:@"bidstatus"] mutableCopy]; 
     [GlobalPool sharedObject].m_dictLevelSubject = [[responseObject valueForKey:@"lvlsubj"] mutableCopy]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 

     [self showServerConnectionError]; 
    }]; 

Затем используйте все ключи для хранения ключей в NSArray. Используя ключи, прочитайте из NSDictionary (который вернет массив).

Код здесь заполняет сборщик ключами. После выбора значения он будет считывать из NSDictionary, чтобы получить соответствующий объект (NSArray) и заполнить второй сборщик.

- (IBAction)actionChooseLevel:(id)sender { 
    NSArray* arrayKeys = [[GlobalPool sharedObject].m_dictLevelSubject allKeys]; 
    if (arrayKeys.count == 0) 
     return; 

    [arrayPickerItems removeAllObjects]; 
    for (int nIdx = 0; nIdx < arrayKeys.count; nIdx++) 
    { 
     NSMutableString* strInfo = [arrayKeys objectAtIndex:nIdx]; 
     [arrayPickerItems addObject:strInfo]; 
    } 

    [ActionSheetStringPicker showPickerWithTitle:@"Choose Level" rows:arrayPickerItems initialSelection:nSelectedLevelIdx > 0 ? nSelectedLevelIdx : 0 target:self successAction:@selector(itemWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender]; 
} 

- (IBAction)actionChooseSubject:(id)sender { 
    NSArray* arrayObject = [[GlobalPool sharedObject].m_dictLevelSubject objectForKey:self.m_lblSelectedLevel.text]; 
    if (arrayObject.count == 0) 
     return; 

    [arrayPickerItems removeAllObjects]; 
    for (int nIdx = 0; nIdx < arrayObject.count; nIdx++) 
    { 
     NSMutableString* strInfo = [arrayObject objectAtIndex:nIdx]; 
     [arrayPickerItems addObject:strInfo]; 
    } 

    [ActionSheetStringPicker showPickerWithTitle:@"Choose Subject" rows:arrayPickerItems initialSelection:nSelectedSubjectIdx > 0 ? nSelectedSubjectIdx : 0 target:self successAction:@selector(itemWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender]; 
}