2012-04-28 3 views
10

Я работаю с API Underground Underground, чтобы сделать приложение, и я попал в ловушку, анализируя блок, связанный с серьезными предупреждениями. JSON использует пары ключ-значение, у которых есть пара значений ключа ключа, которые не были проблемой для меня, поскольку я могу сделать последующие NS-словари из них, но запись для серьезных предупреждений оказалась проблематичной. См ниже:Разбор массива JSON в NSDictionary

"alerts": [ 
    { 
    "type": "WAT", 
    "description": "Flash Flood Watch", 
    "date": "3:13 PM EDT on April 28, 2012", 
    "date_epoch": "1335640380", 
    "expires": "8:00 AM EDT on April 29, 2012", 
    "expires_epoch": "1335700800", 
    "message": "\u000A...Flash Flood Watch in effect through Sunday morning...\u000A\u000AThe National Weather Service in Charleston has issued a\u000A\u000A* Flash Flood Watch for portions of northeast Kentucky... (Note: I trimmed this for length's sake), 
    "phenomena": "FF", 
    "significance": "A" 
    } 
] 

The «оповещение» пара отличается от других, я был в состоянии разобрать, потому что он имеет эту [] брекет окружающего суб-значение, и я не знаю, как очистить его так Я могу получить доступ к подвалам. В других примерах, которые я смог проанализировать, он имеет только {} скобки, а не как скобки {} и []. Для справки всегда присутствуют скобки, даже если нет никаких предупреждений о погоде ... в этом случае пара «предупреждений» возвращает скобки [] без присутствия подпапок.

Есть ли способ удалить [] скобки из NSDictionary или игнорировать их? Любой совет будет принят во внимание!


Для справки и устранению неисправностей, вот как я разбора остальной части документа JSON успешно:

1) Создание NSDictionary из сырья JSON

//Process Weather Call 
NSError* error; 
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

2) Создать последующие словари для вложенных json-пар

NSDictionary *current_observation = [json objectForKey:@"current_observation"]; 

3) Назначить значения

NSString* weather; 
weather = [current_observation objectForKey:@"weather"]; 

Таким образом, конечным результатом будет строка, в которой говорится «Частично облачно» или что-то еще, а также многочисленные связанные с этим значения погоды, которые я не показывал. Эти синтаксические разборки успешно выполняются, потому что у них есть только скобки области {}, а не скобки [].

ответ

19

Кронштейны означают, что данные Json имеются в массиве. Вы можете разобрать его следующим образом

NSArray *alertArray = [json objectForKey:@"alerts"]; 

теперь вы должны перебрать все предупреждения и анализировать их (в вашем случае это только один, но это может быть больше в другом JSon строке):

//parse each alert 
for (NSDictionary *alert in alertArray){ 
    NSString* description = [alert objectForKey:@"description"]; 
    //etc... 
} 
+0

Конечно, массив!Эти скобки должны были отдать ее ... Я думаю, что сегодня я слишком долго работал. : p В любом случае это также имеет смысл в контексте предупреждений - в данный момент может быть более одного предупреждения, поэтому должен быть какой-то способ справиться с этим в API. Я дам вам попробовать - спасибо за вашу помощь! –

5

Хорошо , Я получил его работу - и я хотел привести здесь пример, потому что мне пришлось использовать совет @Lefteris, чтобы он работал.

В итоге мне пришлось передать массив json сначала как NSArray, а затем я преобразовал его в NSDictionary с первым элементом массива. Все потом работало как описано @Lefteris.

Таким образом, в конце концов, вот что я получил:

NSArray *alerts = [json objectForKey:@"alerts"]; 
NSDictionary *alertDict = [[NSDictionary alloc] init]; 

//Check that no alerts exist to prevent crashing 
if([alerts count] < 1) { 
    NSLog(@"No Alerts Here!"); 
    type = nil; 
    ... 
} 
else //Populate fields 
{ 
    alertDict = [alerts objectAtIndex:0]; 
    for (NSDictionary *alert in alertDict) 
    { 
     NSLog(@"Printing alert!"); 
     type = [alertDict objectForKey:@"type"]; 
     ... 
    } 
} 

Это заставило меня и работает с один итерацию массива - происходит, я ожидаю, что я могу просто перебрать массив так как я знаю счет и обрабатываю любые дополнительные предупреждения. Спасибо еще раз за помощь!

+0

Этот код по-прежнему работает, я попробовал его с вашим примером – Khay

+0

@Khay Извините? В то время работал отлично. Мне кажется подозрительным, что никто не указал на проблему с просмотром 10 тыс. И через 2 года. Используете ли вы ту же версию iOS и те же (или сопоставимые) данные? Кроме того, просмотрите историю изменений ответа Лефтериса - код, измененный в прошлом году, поэтому что-то может измениться с новыми версиями. Я действительно не мог сказать вам, что больше не работаю с iOS. –