ios - 如何使用objective-c中的嵌套字典和动态键解析JSON响应?
问题描述
如何解析具有嵌套字典和动态键的 JSON 响应?
response dictionary: {
"Meta Data" = {
"1. Information" = "Intraday Prices and Volumes for Digital Currency";
"2. Digital Currency Code" = BTC;
"3. Digital Currency Name" = Bitcoin;
"4. Market Code" = USD;
"5. Market Name" = "United States Dollar";
"6. Interval" = 5min;
"7. Last Refreshed" = "2018-08-07 15:45:00";
"8. Time Zone" = UTC;
};
"Time Series (Digital Currency Intraday)" = {
"2018-08-06 01:20:00" = {
"1a. price (USD)" = "7074.26229231";
"1b. price (USD)" = "7074.26229231";
"2. volume" = "66564.61550730";
"3. market cap (USD)" = "470895549.48574001";
};
我试图在我的应用程序中显示最新的比特币价格。JSON 响应将具有时间间隔作为动态键,例如“2018-08-06 01:20:00”。
我只对“1a. 价格(美元)”=“7074.26229231”每个区间的一部分。考虑到外部键是动态的,我如何获得该值?(每隔 5 分钟,该间隔会有一个新的键值对)
到目前为止我写的代码:
NSString *urlString = @"https://www.alphavantage.co/query?function=DIGITAL_CURRENCY_INTRADAY&symbol=BTC&market=USD&apikey=*******";
NSURL *url = [NSURL URLWithString:urlString];
[[NSURLSession.sharedSession dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSError *err;
NSDictionary *coinDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&err];
if (err) {
NSLog(@"Failed to serialize into JSON: %@", err);
return;
}
NSLog(@"response dictionary: %@", coinDictionary);
}] resume];
完整的 JSON 响应: 演示
解决方案
1a price
这将打印每个字典的日期键和值
NSDictionary *coinDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&err];
NSDictionary *timeSeries = coinDictionary[@"Time Series (Digital Currency Intraday)"];
for (NSString *key in timeSeries) {
NSDictionary *rates = timeSeries[key];
NSString *price1a = rates[@"1a. price (EUR)"];
NSLog(@"%@ - %@", key, price1a);
}
要仅获取最近的日期,请获取表示日期的字典键,对它们进行排序并获取最后一个。
NSDictionary *coinDictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&err];
NSDictionary *timeSeries = coinDictionary[@"Time Series (Digital Currency Intraday)"];
NSArray *keys = [[timeSeries allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSString *mostRecentDate = keys.lastObject;
NSDictionary *rates = timeSeries[mostRecentDate];
NSString *price1a = rates[@"1a. price (EUR)"];
推荐阅读
- sql - 无法显示错误子报告
- python - 如何在火花中读取固定字符长度的格式文件
- javascript - --skip-js-errors 特定测试用例
- java - Spring Boot SpEL 和配置属性绑定到常量表达式
- android - Firestore 复合索引排序不修改顺序
- node.js - 使用 Meteor 从 Mongo 同步读取数据
- c++ - 在继承的模板类中使用下标 [] 运算符
- vba - VBA用换行符替换str
- terraform-template-file - Terraform Template_File 渲染不工作
- reactjs - React:哪个是推荐的箭头或正常功能?