2013-04-04 2 views
2

У меня возникли проблемы с получением данных, которые я хочу в файле JSON. Вот сокращенный вариант выхода из моей консоли:Разбор массива JSON со словарями

{ 
    AUD =  { 
     15m = "125.15547"; 
     24h = "124.74"; 
     buy = "121.0177"; 
     last = "125.15547"; 
     sell = "123.44883"; 
     symbol = "$"; 
    }; 
    BRL =  { 
     15m = "120.34"; 
     24h = "120.34"; 
     buy = "120.34"; 
     last = "120.34"; 
     sell = "120.34"; 
     symbol = "R$"; 
    }; 
    CAD =  { 
     15m = "129.08612"; 
     24h = "131.07"; 
     buy = "128.66227"; 
     last = "129.08612"; 
     sell = "129.08612"; 
     symbol = "$"; 
    }; 
} 

Я пытаюсь разобрать этот файл с помощью встроенного в JSON синтаксического анализа библиотеки. Вот анализатор в моем viewDidLoad метод:

_tickerArray = [NSMutableArray array]; 

    NSURL *tickerDataURL = [NSURL URLWithString:@"https://blockchain.info/ticker"]; 
    NSData *jsonData = [NSData dataWithContentsOfURL:tickerDataURL]; 
    NSError *error = nil; 
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
    NSLog(@"%@", dataDictionary); 
    NSArray *ar = [NSArray arrayWithObject:dataDictionary]; 
    for (NSString *key in [dataDictionary allKeys]) { 
     for (NSDictionary *dict in ar) { 
      TickerData *t; 
      t.currency = [dict objectForKey:key]; 
      t.symbol = [dict objectForKey:@"symbol"]; 
      t.last = [dict objectForKey:@"last"]; 
      [_tickerArray addObject:t]; 
     } 

    } 

Я хочу, чтобы хранить код валюты (например, AUD or BRL) в t.currency наряду с некоторыми другими данными, содержащимися в словаре валюте, но теперь мое приложение рушится. Код Ошибка:

NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil 

Ни один из объектов не кажется, добавляются в _tickerArray

Помощь?

EDIT: Получение ключей для отображения с правильными данными заполнения других полей:

NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
    NSLog(@"%@", dataDictionary); 


    for (NSString *key in [dataDictionary allKeys]) { 
     NSDictionary *dic=[dataDictionary objectForKey:key]; 
      TickerData *t=[[TickerData alloc] init]; 
      t.currency = key;//EDITED 
      t.symbol = [dic objectForKey:@"symbol"]; 
      t.last = [dic objectForKey:@"last"]; 
      [_tickerArray addObject:t]; 

    } 

ответ

3
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 
NSLog(@"%@", dataDictionary); 
//NSArray *ar = [NSArray arrayWithObject:dataDictionary];//REMOVED 
for (NSString *key in [dataDictionary allKeys]) { 
    NSDictionary *dic=[dataDictionary objectForKey:key];//ADDED 
    for (NSString *dickey in [dic allKeys]) { //MODIFIED 
     NSDictionary *dict=[dic objectForKey:dicKey];//ADDED 
     TickerData *t=[[TickerData alloc] init];//ALLOC INIT ? 
     t.currency = key;//EDITED 
     t.symbol = [dict objectForKey:@"symbol"]; 
     t.last = [dict objectForKey:@"last"]; 
     [_tickerArray addObject:t]; 
    } 

} 

Ваших данные не содержат какой-либо массив , все его словари, попробуйте приведенный выше код, также см. комментарии.

Надеюсь, что это сработает ..

Отредактировано:

Да, вы должны инициализировать объект тоже, как было предложено выше в других ответах ..

+0

Кажется, он работает лучше, чем код, который у меня был. Хотя теперь я получаю сообщение об ошибке '__NSCFNumber objectForKey:]: непризнанный селектор, отправленный в экземпляр 0x7184550', причем этот экземпляр является' dict', который, согласно моей консоли, получает значение от '15m' в файле JSON – cherbear

+0

Отладка и попытайтесь исправить, мой код непроверен, хотя .. Но ваш код не будет работать, что вы пытаетесь сделать. – iphonic

+0

+1! Небольшая коррекция: 't.currency = [dict objectForKey: key]' должно быть, должно быть 't.currency = [dict objectForKey: @" symbol "]' –

0

Попробуйте это ....

NSURL *url = [NSURL URLWithString:@"https://blockchain.info/ticker"]; 

NSLog(@"API : %@",url); 

NSMutableData *jsonData = [NSMutableData dataWithContentsOfURL:url]; 

NSString *data = [[NSString alloc] initWithBytes: [jsonData mutableBytes] length:[jsonData length] encoding:NSUTF8StringEncoding]; 

dictionary = [data JSONValue]; 
NSDictionary *dict = [dictionary objectForKey:@"AUD"]; 
NSLog(@"%@",dict); 
NSString *last = [dict valueForKey:@"last"]; 
NSLog(@"%@",last); 
4

t равна нулю, вы должны Alloc/инициализации него:

TickerData *t = [[TickerData alloc] init]; 
+0

Да точно +1 :-) – iphonic

+0

Ну, это не вызывает сбой, который хорош. Но по какой-то причине ни один из ярлыков, которые я помещал в свой TableView, похоже, не получает данные. Но все отображается правильно в моей консоли, так как я добавил «NSLOG» вне операторов for. Благодаря! – cherbear

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