json从雅虎天气解析

时间:2012-08-30 08:05:03

标签: ios json yahoo-weather-api

我对iOS中名为JSON Parsing的东西很陌生。任何人都可以解释我如何从头开始解析数据。基本上我要告诉的是,我正在使用Yahoo weather api来获取某个位置的天气。http://weather.yahooapis.com/forecastjson?w=2502265是我正在使用它的链接。现在我该如何解析它的数据? 我这样做是错误的。有人可以纠正它或者告诉我该怎么做吗?

NSString * address = @"http://weather.yahooapis.com/forecastjson?w=2502265";
NSString * request = [NSString stringWithFormat:@"%@",address];
NSURL * URL = [NSURL URLWithString:request];
NSString* JSON = [NSString stringWithContentsOfURL:URL encoding:NSUTF8StringEncoding error:&error];
NSError *e = nil;
NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:JSON options:NSJSONReadingMutableContainers error:&e];
         NSLog(@"%@", json);

1 个答案:

答案 0 :(得分:2)

我发现AFNetworking让我的生活更加轻松。

我通常做的不仅仅是传递POST参数,但这适用于你的情况:

NSURL *url = [NSURL URLWithString:@"http://weather.yahooapis.com/forecastjson?w=2502265"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    // PARSE YOUR JSON DICTIONARY HERE
    [self parseResult:JSON];
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
    NSLog(@"Failed to get data from web service, error: %@", [error localizedDescription]);
}];

[operation start];



// method to parse web service JSON
-(void)parseResult:(id)jsonDictionary
{
    // parse result here
    NSLog(@"Title = %@", [jsonDictionary valueForKey:@"title"];
}

希望有所帮助。

您的一些基本信息

您正在做的是从网络服务请求信息。

您可以将Web服务视为服务器上的脚本,以侦听特定的POST或GET参数。

您可能拥有以下网络服务:

http://www.mywebservice.com/rest/datatype=User?name=JohnSmith&age=20

请注意,“datatype”,“name”和“age”是Web服务所期望的参数。当您向Web服务发出请求时,通常会将值传递给这些参数(在本例中为“User”,“JohnSmith”和“20”为值)。

现在,Web服务通常会以JSON或XML的形式返回数据。

JSON不必执行所有这些XML格式化,因此,JSON往往更适合返回数据。

返回的JSON数据类似于:

{
    users = {(
        ({
           name = John Smith;
           age = 20;
           address = 123 Easy Street EARTH
        }),
        ({
           name = Bob Brown;
           age = 35;
           address = 456 Some Road EARTH
        })
    )};
}

上面的内容有点令人生畏,但一旦你处理过一次,你就会发现这些通常是嵌套在数组中的字典,嵌套在巨型字典中。

与上面的情况一样,返回的JSON数据是包含所有用户的单个巨型字典。当你做类似的事情时:

[JSON objectForKey:@"users"]

你得到“用户”数组:

    users = {(
        ({
           name = John Smith;
           age = 20;
           address = 123 Easy Street EARTH
        }),
        ({
           name = Bob Brown;
           age = 35;
           address = 456 Some Road EARTH
        })
    )};

然后,如果你想从“用户”数组中获取特定用户,比如Bob Brown,你可以这样做:

[[JSON objectForKey:@"users"] objectAtIndex:1]

这会让你回头:

{
   name = Bob Brown;
   age = 35;
   address = 456 Some Road EARTH
}

最后,要获取用户的属性,例如他们的名字,你可以去:

[[[JSON objectForKey:@"users"] objectAtIndex:1] valueForKey:@"name"];

例如:

NSLog(@"User name = %@", [[[JSON objectForKey:@"users"] objectAtIndex:1] valueForKey:@"name"]);

真正的网络服务词典通常不是很好的格式,它们通常有点复杂,特别是像Drupal那样的CMS(运行!!!):D