1

我有一些从 URL 中提取的 JSON 数据。我编写的代码可以很好地下载 JSON 并解析它,但我似乎也无法按照我的需要访问它,尤其是在数据作为另一个子元素包含的情况下。

这是 JSON 格式:

{
    address = "<null>";
    city = "<null>";
    country = UK;
    "country_code" = GB;
    daylight = 1;
    for = daily;
    items =     (
                {
            asr = "5:22 pm";
            "date_for" = "2013-7-1";
            dhuhr = "1:01 pm";
            fajr = "2:15 am";
            isha = "11:47 pm";
            maghrib = "9:24 pm";
            shurooq = "4:39 am";
        }
    );
    latitude = "50.9994081";
    link = "http://muslimsalat.com/UK";
    longitude = "0.5039011";
    "map_image" = "http://maps.google.com/maps/api/staticmap?center=50.9994081,0.5039011&sensor=false&zoom=13&size=300x300";
    "postal_code" = "<null>";
    "prayer_method_name" = "Muslim World League";
    "qibla_direction" = "119.26";
    query = "51.000000,0.500000";
    state = "<null>";
    timezone = 0;
    title = UK;
    "today_weather" =     {
        pressure = 1020;
        temperature = 14;
    };
}

(这些是伊斯兰祈祷时间。)

到目前为止,我的 Objective-C 是这样的:

-(CLLocationCoordinate2D) getLocation{
    CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = kCLDistanceFilterNone;
    [locationManager startUpdatingLocation];
    CLLocation *location = [locationManager location];
    CLLocationCoordinate2D coordinate = [location coordinate];

    return coordinate;
}

//class to convert JSON to NSData
- (IBAction)getDataFromJson:(id)sender {
    //get the coords:
    CLLocationCoordinate2D coordinate = [self getLocation];
    NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
    NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];

    NSLog(@"*dLatitude : %@", latitude);
    NSLog(@"*dLongitude : %@",longitude);

    //load in the times from the json
    NSString *myURLString = [NSString stringWithFormat:@"http://muslimsalat.com/%@,%@/daily/5.json", latitude, longitude];
    NSURL *url = [NSURL URLWithString:myURLString];
    NSData *jsonData = [NSData dataWithContentsOfURL:url];

    if(jsonData != nil)
    {
        NSError *error = nil;
        id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
        NSArray *jsonArray = (NSArray *)result; //convert to an array
        if (error == nil)
            NSLog(@"%@", result);
            NSLog(@"%@", jsonArray);
            for (id element in jsonArray) {
                NSLog(@"Element: %@", [element description]);

            }
    }
}

运行此代码时,我得到的唯一输出是元素名称列表(address, city, country等等)。items是给定的,但不是它的子元素。我知道这就是我要求的代码:

for (id element in jsonArray) {
    NSLog(@"Element: %@", [element description]);
}

但我不知道如何进入下一步。

我需要的唯一数据值实际上是时间本身(so, items>asr, items>dhuhr, 等)。

如何自己获取这些值,然后将它们保存为我可以使用的值?

谢谢!

4

3 回答 3

4

(...); - 是数组

{...}; - 是字典

所以你的“元素”是字典

使用 objectForKey:

例子:

for (id element in jsonArray) {
    NSLog(@"Element asr: %@", [element objectForKey:@"asr"]); // or element[@"asr"]
}
于 2013-07-01T06:45:17.097 回答
3

NSArray *jsonArray = (NSArray *)result; //convert to an array

这不会“转换”,只是您承诺编译器实际上result是一个NSArray. 在这种情况下,这是一个谎言。

您的代码当前只是打印 JSON 中返回的字典中的键列表。试试这个来获取项目列表(它是一个数组,所以你需要处理可能有多个条目):

NSDictionary *result = [NSJSONSerialization ...

for (NSDictionary *itemDict in result[@"items"]) {
    NSLog(@"item: %@", itemDict);
}

然后你可以提取时间。

于 2013-07-01T06:52:35.800 回答
1

您可以通过以下方式提取信息:

 NSError* error = nil;
 NSDictionary *userInfo; //your main data

 if([NSJSONSerialization class])
  userInfo = [NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error];

//to extract items
  NSDictionary *items = [[[userInfo objectForKey:@"items"] JSONValue] objectAtIndex:0];
于 2013-07-01T06:55:25.543 回答