2012-04-11 5 views
0

Я загрузил данные JSON Data, но у меня возникли проблемы с доступом к определенному объекту. Из моих данных в формате JSON, я пытаюсь вытащить последний value из variableName = "Elevation of reservoir water surface above datum, ft";Доступ к данным JSON в Objective C

Вот мой код:

- (void)viewWillAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 

NSURL *url = [NSURL URLWithString:@"http://waterservices.usgs.gov/nwis/iv/?sites=02334400&period=P7D&format=json"]; 

NSData *jsonData = [NSData dataWithContentsOfURL:url]; 
if (jsonData != nil) { 
    NSError *error = nil; 

    id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error: &error]; 

    if (error == nil) 
     NSLog(@"%@", result); 
} 
} 

Отредактировано: Это слишком много данных, чтобы напечатать выход, но вот как я достигаю объект в JS. Я не могу написать работу на утверждение, что будет делать то же самое в Obj-C:

var d = JSON.parse(responseText); 
    for (var i = 0; i < d.value.timeSeries.length; i++) { 
     if (d.value.timeSeries[i].variable.variableName == 'Elevation of reservoir  water surface above datum, ft') { 
      var result = d.value.timeSeries[i].values[0].value[d.value.timeSeries[i].values[0].value.length - 1]; 
      console.log(result); 
     } 
+0

NSLog ваш результат на консоль и опубликуйте это. Ваш 'id result' - это, вероятно, массив или словарь массивов или словарей. Мы должны понять это, чтобы мы могли идти за данными. –

+0

JSON отображает непосредственно в слоистую структуру NSArrays и NSDictionarys. Вам нужно выяснить, какова фактическая структура (которая зависит от данных JSON), а затем просто очистить слои лука. –

+0

Выход более 100000 символов. У меня возникли проблемы с дублированием этого оператора JS FOR в Obj-C. – mnort9

ответ

2

Это очень некрасиво, но это должно дать вам то, чтобы начать с:

NSArray *timeSeries = [JSON valueForKeyPath:@"value.timeSeries"]; 

[timeSeries enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSString *variableName = [obj valueForKeyPath:@"variable.variableName"]; 

    if ([variableName isEqualToString:@"Elevation of reservoir water surface above datum, ft"]) { 

     NSArray  *values = [obj valueForKey:@"values"]; 
     NSDictionary *value = [values objectAtIndex:0]; 

     values = [value objectForKey:@"value"]; 
     value = [values lastObject]; 

     NSLog(@"%@", [value objectForKey:@"value"]); 
    } 
}]; 

Обратите внимание

Там будет никакой проверки проверки/диапазон любого вида я оставлю это упражнение для вас, чтобы сделать

0

Одна вещь, которую вы можете рассмотреть использует инструмент для создания классов моделей для вас. Таким образом, вы можете использовать точечные аксессоры, чтобы сделать вашу жизнь немного легче. В Mac App Store JSON Accelerator или Objectify являются довольно хорошими вариантами. Затем вы переносите NSDictionary в эти классы моделей, и это довольно легко.

Смежные вопросы