如何解析JSON字典并将键和值放在单独的数组中 - Objective C

时间:2017-02-28 04:27:13

标签: ios objective-c json nsdictionary xcode8

我正在尝试解析www.fixer.io JSON以获取货币数据。我一直在解析JSON并尝试将键和值与“rates”字典分开。我需要它们分开,所以我可以将它们放在数组中以显示货币名称(例如:USD,EUR,JPN)及其各自的费率。

我读过我必须使用“allKeys”和“allValues”才能做到这一点,但到目前为止我没有运气。有什么想法吗?

NSURL *fixerURL = [NSURL URLWithString:@"http://api.fixer.io/latest?base=USD"];
NSData *data = [NSData dataWithContentsOfURL:fixerURL];
NSError *error;

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

    NSMutableArray *arr = [[NSMutableArray alloc]init];
    NSMutableArray *arr2 = [[NSMutableArray alloc]init];
    NSArray *names;
    NSArray *rates;


    for (names in json) {
        names = [json allKeys];
        for (rates in json) {
            rates = [json allValues];
        }
        [arr addObject:names];
        [arr2 addObject:rates];
    }
    self.currencyList = arr;
    self.currencyRates = arr2;
    [self updateTableView];

这是JSON ---> http://api.fixer.io/latest?base=USD

5 个答案:

答案 0 :(得分:4)

希望这会对你有所帮助,

NSURL *fixerURL = [NSURL URLWithString:@"http://api.fixer.io/latest?base=USD"];
    NSData *data1 = [NSData dataWithContentsOfURL:fixerURL];
    NSError *error;

    NSDictionary *json1 = [NSJSONSerialization JSONObjectWithData:data1 options:kNilOptions error:&error];
    NSLog(@"%@",json1);
    NSDictionary *json = [[NSDictionary alloc]initWithDictionary:[json1 objectForKey:@"rates"]];
    NSMutableArray *arr = [[NSMutableArray alloc] initWithArray:[json allKeys]];
    NSMutableArray *arr2 = [[NSMutableArray alloc]initWithArray:[json allValues]];
    NSLog(@"%@",arr);
    NSLog(@"%@",arr2);

答案 1 :(得分:1)

因为费率键包含字典而非数组,因此我们无法将国家/地区名称和货币作为字典格式 如果你想获得不同数组中的国家名称和货币,那么你需要像下面那样单独获取它们

NSArray *arrKeys = [[json valueForKey:@"rates"] allKeys];
NSArray *arrValues = [[json valueForKey:@"rates"] allValues];

答案 2 :(得分:0)

根据您的JSON回复,您必须获得以下所有货币汇率

NSMutableArray *allCurrencyKey = [[json valuesForKey:@"rates"] allKeys];

NSMutableArray *allRates = [json valueForKey:@"rates"];

for(NSString *strCurKey in allCurrencyKey)
{
   NSLog (@" %@ rate is %@ ", strCurKey, [allRates valueForKey :strCurKey ]);
}

希望这会对你有所帮助。

答案 3 :(得分:0)

我不确定你会得到什么错误,但是当我尝试运行此代码时,我会将数据恢复为零。这当然会崩溃应用程序。

它可能与您用于获取JSON的方法有关。 dataWithContentsOfURL:不应用于基于网络的URL。 dataWithContentsOfURL:

要通过网络获取数据,请查看NSURLSession

答案 4 :(得分:0)

使用以下代码获取费率Nad货币名称

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

通过此回复,您可以获得所有费率:

NSMutableDictionary *rates = [json objectForKey:@"rates"];

//Get All Currency Names by `allKeys`.
NSArray *currencyTitles = [rates allKeys];

for(NSString *currencyName in currencyTitles){

    //Get Value.
    NSString *aStrCurValue = [rates objectForKey:currencyName];
}