从json获取单个特定值

时间:2014-05-15 21:07:13

标签: ios json key-value weather-api

正如您所料,我对obj-C相当新,并且我一直在努力建立知识和经验。但是我仍然在努力解决很多概念,其中包括JSON数据和捕捉#39; 我已经看过很多教程和指南,但我无法将它们翻译成我需要的东西。大多数情况下,他们将数据布局在数组中或获取多个值,并且(当然)使用不同的变量,这使得一切都让我感到困惑和不清楚,即使这应该是非常简单的。

我试图做一些非常简单的事情: 从开放天气API(温度)中获取单个值。

我会告诉你我的代码,根据我可耻的知识,它应该是完美的,但显然它不起作用:D

@implementation HomeViewController
{

    NSMutableArray *tableData;
    NSDictionary *jsonDict;
    NSMutableString *title;
}
-(void) viewDidLoad
{
    [super viewDidLoad];

    NSError *error;


    //I create my data array and the string i'll store my value later on
    tableData = [[NSMutableArray alloc] init];
    title = [[NSMutableString alloc]init];

   // Creating the link for the json api so it fits coordinates ; this works but i edited the locations out to clear the code
    NSString *s = [[NSString alloc]initWithFormat:@"http://api.openweathermap.org/data/2.5/weather?lat=%.05f&lon=%.05f", _annotation.coordinate.latitude, _annotation.coordinate.longitude];

    // I go online and catch the data of the url stored in S
    NSData *jSonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:s]];

    // This is a dictionary where all my data is stored from jsonData, keys and values all the way
    jsonDict = [NSJSONSerialization JSONObjectWithData:jSonData options:NSJSONReadingMutableContainers error:&error];

    // I use the string created previously and assign it the value stored in that dictionary, in the TEMP 'folder', right under MAIN.

    title = [[jsonDict objectForKey:@"main"]objectForKey:@"main.temp"];

     // I assign that title to a label so it appears in my view.
     self.tempLabel.text = title;
    ...
    }

你去吧。我可能错过了一些非常简单的事情,但我一直坚持这一点,即使我觉得我知道我在做什么,我可能会遗漏一些东西。所以,如果你给我答案,你也可以告诉我我做错了什么:D

非常感谢您的支持和知识。这个社区很棒:)

3 个答案:

答案 0 :(得分:1)

在为jsonDict指定值并使用

后设置断点

po jsonDict

在控制台中

打印出你得到的内容。然后,调整提取值的代码。并使用现代的Objective-C语法。

实施例

title = jsonDict[@"main"][@"temp"];

注意

po是一个调试器命令,它将打印出对象的内容。如果需要打印基元的内容,请改用p

答案 1 :(得分:0)

这应该让你正确:

title = [[jsonDict objectForKey:@"main"]objectForKey:@"temp"];

为了解释这个问题,您似乎在使用密钥中的点语法组合来引用temp

编辑:为了回应您的错误:

当您尝试在非NSString类型的值上查找字符串的长度时,会出现该错误。看起来temp作为数字返回。所以,为了做你想要做的事情,你会想要将[[jsonDict objectForKey:@"main"]objectForKey:@"temp"]转换为NSString:

NSNumber *temp = [[jsonDict objectForKey:@"main"]objectForKey:@"temp"]; NSString *tempString = [temp stringValue];

OR

NSString *temp = [[[jsonDict objectForKey:@"main"]objectForKey:@"temp"] stringValue];

这样您就可以获得lengthtemp.length

**编辑:除非您试图获取天气数据数组的长度...在这种情况下我想看到更多的代码

答案 2 :(得分:0)

我的猜测是

 jsonDict = [NSJSONSerialization JSONObjectWithData:jSonData options:NSJSONReadingMutableContainers error:&error];

正在尝试创建一个nsdictionary,但结果会以数组的形式返回。试试这个:

NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonDict options: NSJSONReadingMutableContainers error: &e];

if (!jsonArray) {
  NSLog(@"Error parsing JSON: %@", e);
} else {
   for(NSDictionary *item in jsonArray) {
      NSLog(@"Item: %@", item);
   }
}