2013-04-04 72 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

帮助?

编辑:获取键与适当的数据填充等领域显示:

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',根据我的控制台从JSON文件中的'15m'得到它的值 – cherbear 2013-04-04 05:12:20

+0

调试并尝试更正,我的代码虽然未经测试..但是,您的代码将无法正常工作... – iphonic 2013-04-04 05:15:16

+0

+1!小修正:'t.currency = [dict objectForKey:key]'应该是't.currency = [dict objectForKey:@“symbol”]' – 2013-04-04 05:27:11

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是零,你必须分配/初始化它:

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

完全是+1 :-) – iphonic 2013-04-04 05:11:51

+0

这不会导致崩溃,这很好。但由于某种原因,我放入TableView的标签似乎都没有获取数据。但是在我的控制台中一切正常,因为我在for语句之外添加了一个'NSLOG'。谢谢! – cherbear 2013-04-04 05:17:26