使用NSDictionary获取特定的Json数据

时间:2014-12-08 20:55:37

标签: ios objective-c json cocoa-touch nsdictionary

我想用json数据在NSDictionnary中获取特定值。 我想仅获取关键字“windspeedMiles”的第一个值(在current_condition中)。 我获取的Json数据是:

{
  "data": {
    "nearest_area": [
      {
        "distance_miles": "0.0",
        "latitude": "54.500",
        "longitude": "-8.500"
      }
    ],
    "request": [
      {
        "query": "Lat 54.50 and Lon -8.50",
        "type": "LatLon"
      }
    ],
    "weather": [
      {
        "date": "2014-12-09",
        "hourly": [
          {
            "cloudcover": "59",
            "humidity": "84",
            "precipMM": "0.1",
            "pressure": "1024",
            "sigHeight_m": "3.1",
            "swellDir": "290",
            "swellHeight_m": "3.0",
            "swellPeriod_secs": "12.6",
            "tempC": "5",
            "tempF": "41",
            "time": "0",
            "visibility": "10",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "116",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0002_sunny_intervals.png"
              }
            ],
            "winddir16Point": "SSW",
            "winddirDegree": "204",
            "windspeedKmph": "34",
            "windspeedMiles": "21"
          },
          {
            "cloudcover": "84",
            "humidity": "87",
            "precipMM": "0.1",
            "pressure": "1020",
            "sigHeight_m": "0.6",
            "swellDir": "240",
            "swellHeight_m": "0.1",
            "swellPeriod_secs": "12.4",
            "tempC": "6",
            "tempF": "42",
            "time": "300",
            "visibility": "10",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "119",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0003_white_cloud.png"
              }
            ],
            "winddir16Point": "SSW",
            "winddirDegree": "193",
            "windspeedKmph": "45",
            "windspeedMiles": "28"
          },
          {
            "cloudcover": "75",
            "humidity": "91",
            "precipMM": "0.4",
            "pressure": "1016",
            "sigHeight_m": "3.1",
            "swellDir": "290",
            "swellHeight_m": "3.0",
            "swellPeriod_secs": "11.3",
            "tempC": "7",
            "tempF": "44",
            "time": "600",
            "visibility": "2",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "266",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0017_cloudy_with_light_rain.png"
              }
            ],
            "winddir16Point": "SSW",
            "winddirDegree": "193",
            "windspeedKmph": "54",
            "windspeedMiles": "34"
          },
          {
            "cloudcover": "0",
            "humidity": "93",
            "precipMM": "0.8",
            "pressure": "1011",
            "sigHeight_m": "1.0",
            "swellDir": "250",
            "swellHeight_m": "0.2",
            "swellPeriod_secs": "10.6",
            "tempC": "16",
            "tempF": "61",
            "time": "900",
            "visibility": "10",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "113",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png"
              }
            ],
            "winddir16Point": "SSW",
            "winddirDegree": "202",
            "windspeedKmph": "62",
            "windspeedMiles": "39"
          },
          {
            "cloudcover": "98",
            "humidity": "95",
            "precipMM": "6.6",
            "pressure": "1006",
            "sigHeight_m": "3.7",
            "swellDir": "290",
            "swellHeight_m": "3.6",
            "swellPeriod_secs": "11.0",
            "tempC": "18",
            "tempF": "65",
            "time": "1200",
            "visibility": "7",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "302",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0018_cloudy_with_heavy_rain.png"
              }
            ],
            "winddir16Point": "SW",
            "winddirDegree": "220",
            "windspeedKmph": "64",
            "windspeedMiles": "40"
          },
          {
            "cloudcover": "89",
            "humidity": "95",
            "precipMM": "8.3",
            "pressure": "1003",
            "sigHeight_m": "4.3",
            "swellDir": "290",
            "swellHeight_m": "4.0",
            "swellPeriod_secs": "10.9",
            "tempC": "19",
            "tempF": "65",
            "time": "1500",
            "visibility": "5",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "308",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0018_cloudy_with_heavy_rain.png"
              }
            ],
            "winddir16Point": "SW",
            "winddirDegree": "234",
            "windspeedKmph": "60",
            "windspeedMiles": "38"
          },
          {
            "cloudcover": "49",
            "humidity": "73",
            "precipMM": "1.5",
            "pressure": "1004",
            "sigHeight_m": "5.7",
            "swellDir": "290",
            "swellHeight_m": "5.3",
            "swellPeriod_secs": "10.8",
            "tempC": "7",
            "tempF": "45",
            "time": "1800",
            "visibility": "10",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "353",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0009_light_rain_showers.png"
              }
            ],
            "winddir16Point": "W",
            "winddirDegree": "261",
            "windspeedKmph": "66",
            "windspeedMiles": "41"
          },
          {
            "cloudcover": "58",
            "humidity": "73",
            "precipMM": "0.5",
            "pressure": "1005",
            "sigHeight_m": "7.2",
            "swellDir": "290",
            "swellHeight_m": "6.7",
            "swellPeriod_secs": "10.6",
            "tempC": "5",
            "tempF": "42",
            "time": "2100",
            "visibility": "10",
            "waterTemp_C": "12",
            "waterTemp_F": "53",
            "weatherCode": "353",
            "weatherIconUrl": [
              {
                "value": "http:\/\/cdn.worldweatheronline.net\/images\/wsymbols01_png_64\/wsymbol_0009_light_rain_showers.png"
              }
            ],
            "winddir16Point": "W",
            "winddirDegree": "260",
            "windspeedKmph": "79",
            "windspeedMiles": "49"
          }
        ],
        "maxtempC": "19",
        "mintempC": "5"
      }
    ]
  }
}

这是我的代码:

Reports.m:

#import "Reports.h"

@interface Reports ()

@end

@implementation Reports

- (void)viewDidLoad
{
    [super viewDidLoad];

        NSURL *url = [NSURL URLWithString:@"http://api.worldweatheronline.com/free/v2/weather.ashx?q=Bundoran&format=json&num_of_days=5&key=e1caa114b7fba6f5bcea272e1fc77"];

        NSData *data = [NSData dataWithContentsOfURL:url];
        NSDictionary *dico = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

        NSDictionary *wind = [dico objectForKey:@"windspeedMiles"];
        NSLog(@"The current windspeedMiles is : %@", wind);

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

2 个答案:

答案 0 :(得分:1)

要在您发布的结构中获取该特定值,您可以访问:

[[[[dico objectForKey:@"data"] objectForKey:@"current_condition"] objectAtIndex:0] objectForKey:@"windspeedMiles"]

你只需看看你的结构。当您使用JSONObjectWithData获取字典时,它会为每组花括号提供NSDictionary,为每组方括号提供NSArray

因为JSON中的所有内容都是"数据"的子对象,所以我建议您将原始NSDictionary创建为:

NSDictionary *dico = [[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil] objectForKey:@"data"];

这样您就不必继续引用"数据"字典。

答案 1 :(得分:0)

您的预期密钥位于嵌套的NSDictionary对象中,因此您无法使用以下方法检索它:

NSDictionary *wind = [dico objectForKey:@"windspeedMiles"];
NSLog(@"The current windspeedMiles is : %@", wind);

使用:

NSDictionary *wind = [dico[@"data"][@"condition"] objectAtIndex:0];
NSLog(@"The current windspeedMiles is : %@", wind[@"windspeedMiles"]);