正如您所料,我对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
非常感谢您的支持和知识。这个社区很棒:)
答案 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];
这样您就可以获得length
:temp.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);
}
}