使用字典解析 JSON 数组
Posted
技术标签:
【中文标题】使用字典解析 JSON 数组【英文标题】:Parsing a JSON array with dictionaries 【发布时间】:2013-04-04 04:50:17 【问题描述】:我在获取 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];
【问题讨论】:
【参考方案1】:t
为零,你必须分配/初始化它:
TickerData *t = [[TickerData alloc] init];
【讨论】:
这不会导致崩溃,这很好。但由于某种原因,我放在 TableView 中的所有标签似乎都没有获取数据。但是自从我在 for 语句之外添加了NSLOG
之后,一切都在我的控制台中正确显示。谢谢!【参考方案2】:
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];
你的数据不包含任何数组,它的所有字典,试试上面的代码也看 cmets..
希望它有效..
已编辑:
是的,您也已经初始化了对象,正如上面其他答案中所建议的那样..
【讨论】:
它似乎比我的代码工作得更好。虽然我现在收到一个错误__NSCFNumber objectForKey:]: unrecognized selector sent to instance 0x7184550
,该实例为dict
,根据我的控制台,它的值来自 JSON 文件中的15m
调试并尝试更正,但我的代码未经测试..但是您的代码无法正常工作..
+1!小修正:t.currency = [dict objectForKey:key]
应该是t.currency = [dict objectForKey:@"symbol"]
@MartinR 但我试图将***字典名称放入 t.currency
而不是符号。由于某种原因,我仍然无法将数据显示在表格中。但是它确实显示在我的控制台中
@iphonic 最后一次编辑做到了!密钥现在显示在我的表格中。非常感谢!【参考方案3】:
试试看……
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);
【讨论】:
以上是关于使用字典解析 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用新的 Swift 3 和 Alamofire 解析 JSON(字典和数组)