2012-04-28 21 views
10

Estoy trabajando con Weather Underground API para hacer una aplicación y me he encontrado un inconveniente al analizar el bloque en relación con las alertas graves. El JSON utiliza pares de clave-valor que tienen pares de valores de clave secundaria, lo que no ha sido un problema para mí, ya que puedo sacar posteriores NSDictionaries de ellos, pero la entrada para alertas severas ha resultado problemática. Ver más abajo:Analizando una matriz JSON en 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" 
    } 
] 

Las "alertas" par difiere de otros que he estado capaz de analizar, ya que tiene esta [] soporte de que rodea a los sub-valores y no estoy seguro de cómo borrar tan Puedo acceder a los subvalores. En los otros ejemplos que he podido analizar, solo tiene los corchetes {}, y no los corchetes {} y []. Como referencia, los corchetes están siempre presentes, incluso cuando no hay alertas de clima severo ... en ese caso, el par de "alertas" devuelve los corchetes [] sin subpares presentes.

¿Hay alguna forma de eliminar los soportes [] del NSDictionary o ignorarlos? ¡Cualquier consejo sería apreciado!


Para referencia y ayuda para solucionar problemas, así es como estoy analizando el resto del documento JSON éxito:

1) Crear una NSDictionary del JSON prima

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

2) Crear diccionarios posteriores para pares json anidados

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

3) Asignar valores

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

Así que el resultado final sería una cadena que dice "parcialmente nublado" o algo así, junto con numerosos valores meteorológicos relacionados que no he mostrado. Se analizan correctamente porque solo tienen los corchetes de alcance {}, y no los corchetes [].

Respuesta

19

Los corchetes significan los datos Json que hay en una matriz. Se puede analizar como siguiente

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

ahora usted debe recorrer todas las alertas y analizar ellos (en su caso es sólo 1, pero podría ser más en otra cadena JSON):

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

¡Por supuesto, una matriz!Esos corchetes deberían haberlo regalado ... Creo que he estado trabajando demasiado tiempo hoy. : p De todos modos, también tiene sentido en el contexto de las alertas: puede haber más de una alerta en un momento determinado, por lo que debería haber alguna forma de manejar eso en la API. Lo probaré, ¡gracias por tu ayuda! –

5

Vale , Lo conseguí trabajando, y quería dar un ejemplo aquí porque terminé construyendo sobre el consejo que le dio @Lefteris para que funcione.

Terminé teniendo que pasar la matriz json primero como una NSArray, y luego convertí eso en una NSDictionary con el primer elemento de la matriz. Todo después funcionó como @Lefteris describe.

Así que, al final, esto es lo que tengo:

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

Esto me puso en funcionamiento con una sola matriz iterate - pasando espero que puedo simplemente iterar a través de la matriz ya que conozco el conteo y manejo cualquier alerta adicional. ¡Gracias de nuevo por la ayuda!

+0

Este código todavía está funcionando, lo intenté con su propio ejemplo – Khay

+0

@Khay ¿Perdón? Funcionó bien para mí en ese momento. Me parece sospechoso que nadie haya señalado un problema con 10k puntos de vista y pasaron 2 años. ¿Estás usando la misma versión de iOS y los mismos datos (o comparables) que yo tenía? Además, revise el historial de edición de la respuesta de Lefteris: el código cambió allí el año pasado, por lo que es posible que algo haya cambiado con las versiones más recientes. Realmente no podría decírtelo ya que no trabajo con iOS. –