2012-04-28 19 views
10

Sto lavorando con l'API Weather Underground per creare un'app e ho riscontrato un problema durante l'analisi del blocco relativo agli avvisi gravi. Il JSON utilizza coppie chiave-valore che hanno coppie di valori secondari - che non sono stati un problema per me, dal momento che posso escludere NSDictionaries successivi da questi - ma la voce per gli avvisi gravi si è rivelata problematica. Vedi sotto:Analisi di un array JSON in un 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" 
    } 
] 

Gli "avvisi" coppia si differenzia dagli altri che sono stato in grado di analizzare perché ha questo [] staffa che circonda i sub-valori e non sono sicuro di come cancellare così Posso accedere ai sottovalori. Negli altri esempi che sono stato in grado di analizzare, ha solo le parentesi {} e non entrambe le parentesi {} e []. Per riferimento, le parentesi sono sempre presenti - anche quando non ci sono avvisi di maltempo severi ... in quel caso la coppia "avvisi" restituisce le parentesi [] senza nessuna sottoclasse presente.

C'è un modo per rimuovere le parentesi [] dal NSDictionary o altrimenti ignorarle? Tutto il consiglio sarebbe apprezzato!


Per riferimento e la risoluzione dei problemi, ecco come sto analizzando il resto del documento JSON con successo:

1) Creazione di un NSDictionary dalla JSON grezzo

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

2) Create dizionari successivi per coppie json annidate

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

3) Assegnare valori

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

Quindi il risultato finale sarebbe una stringa che dice "Parzialmente nuvoloso" o qualcosa del genere, insieme a numerosi valori meteorologici correlati che non ho mostrato. Queste analisi vengono eseguite correttamente poiché hanno solo le parentesi di ambito {} e non le parentesi [].

risposta

19

Le parentesi indicano i dati Json presenti in un array. È possibile analizzare come segue

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

ora si dovrebbe collegare attraverso tutti gli avvisi e le parse (nel tuo caso è solo 1, ma potrebbe essere più in un'altra stringa JSON):

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

Ovviamente, un array!Quelle parentesi dovrebbero averlo dato via ... Credo di aver lavorato troppo a lungo oggi. : p In ogni caso ciò ha senso anche nel contesto degli avvisi: possono esserci più avvisi in un dato momento, quindi ci dovrebbe essere un modo per gestirli nell'API. Ci provo, grazie per il vostro aiuto! –

5

Ok , L'ho fatto funzionare - e volevo fornire un esempio qui perché ho finito per dover basarmi sul consiglio che @Lefteris ha dato per farlo funzionare.

Alla fine ho dovuto passare prima l'array JSON come NSArray e poi l'ho convertito in un NSDictionary con il primo elemento dell'array. Tutto in seguito ha funzionato come descritto da @Lefteris.

Così, alla fine, ecco cosa ho:

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"]; 
     ... 
    } 
} 

Questo mi ha installato e funzionante con un singolo array iterate - in corso mi aspetto posso semplicemente scorrere la matrice dal momento che conosco il conteggio e gestisco eventuali avvisi aggiuntivi. Grazie ancora per l'aiuto!

+0

Questo codice è ancora funzionante, l'ho provato con il tuo esempio stesso – Khay

+0

@Khay Ci dispiace? Ha funzionato bene per me in quel momento. Sembra sospetto che nessuno abbia indicato un problema con 10k views e 2 anni passati. Stai usando la stessa versione di iOS e lo stesso (o comparabile) dato che ero? Inoltre, rivedi la cronologia delle modifiche della risposta di Lefteris - il codice è cambiato lì l'anno scorso, quindi qualcosa potrebbe essere cambiato con le versioni più recenti. Non potrei davvero dirtelo visto che non lavoro più con iOS. –