2012-04-12 14 views
9

espero para decodificar los datos JSON a continuación:decodificación JSON para NSArray o NSDictionary

{ 
    "content": 
    [ 
     { 
      "1":"a", 
      "2":"b", 
      "3":"c", 
      "4":"d", 
      "mark":"yes" 
     } 
    ] 
} 

No estoy seguro si lo puso en NSArray o NSDictionary

la bienvenida a cualquier comentario

+8

[¿Qué has probado?] (Http://mattgemmell.com/2008/12/08/what-have-you-tried/) – vikingosegundo

Respuesta

29

¿qué versión de iOS está usando? en iOS 5 tiene la clase NSJSONSerialization para analizar los datos JSON; si necesita orientar los iOS más antiguos o MAC OSX, debe usar lib de terceros como SBJSON. La cadena publicada será un NSDictionary con una matriz con un diccionario. La matriz será accesible mediante la tecla @"content"

En código:

NSString * jsonString = @"blblblblblb"; 
NSStringEncoding encoding; 
NSData * jsonData = [jsonString dataUsingEncoding:encoding]; 
NSError * error=nil; 
NSDictionary * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

En SWIFT 2.0:

let jsonString = "blblblblblb" 
    let encoding = NSUTF8StringEncoding 
    let jsonData = jsonString.dataUsingEncoding(encoding) 
    guard let jData = jsonData else {return} 
    do { 
     let parsedData = try NSJSONSerialization.JSONObjectWithData(jData, options: []) 
    } catch let error { 
     print("json error: \(error)") 
    } 

[ACTUALIZACIÓN] La clase NSJSONSerialization también está disponible para 10,7 mis wasn comentario correcto.

+1

No dice que esto sea para iOS ... – hypercrypt

+0

Lo siento la etiqueta es el objetivo c, por cierto usaste una clase solo disponible en iOS5 ;-) – Andrea

+0

Exactamente, por lo que no tiene que ser iOS. 'NSJSONSerialization' también está disponible en OS X 10.7. – hypercrypt

0

Usted puede hacer lo siguiente :

NSData *data = ...; //JSON data 
NSError *jsonError = nil; 
[NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 

Usted recibirá de vuelta un NSDictionary que contiene un NSArray que contiene un solo NSDictionary que contiene cinco objetos NSString.

3

Esa cadena en particular se decodificará en un NSDictionary porque lo más externo es un objeto JSON que se asigna a un NSDictionary para cada implementación JSON que he visto. Si desea procesar una cadena arbitraria, que tendrá que probar lo que recibe

NSError *jsonError; 
id parsedThing = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; 
if (parsedThing == nil) 
{ 
    // error 
} 
else if ([parsedThing isKindOfClass: [NSArray class]]) 
{ 
    // handle array, parsedThing can be cast as an NSArray safely 
} 
else 
{ 
    // handle dictionary, parsedThing can be cast as an NSDictionary 
    // NB only dictionaries and arrays allowed as long as NSJSONReadingAllowFragments 
    // not specified in the options 
} 
0

stringWithContentsOfFile:encoding: está en desuso en iOS<6

para iOS 6+

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"contents" ofType:@"json"]; 
NSError * error=nil; 
NSString *jsonString = [NSString stringWithContentsOfFile:filePath encoding:nil error:&error]; 
NSData * jsonData = [jsonString dataUsingEncoding:nil]; 
NSArray * parsedData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

contents.json archivo está en su paquete .

0

Utilicé la API de reconocimiento de voz de Google y recibí una respuesta json que no era directamente analizable en iOS. Las muestras de resultados fueron como:

Primero intenté decir Hola 1 2 3, que se reconoció sin problemas. respuesta JSON fue:

{"result":[]} 

{"result":[{"alternative":[{"transcript":"hello 123","confidence":0.59780568},{"transcript":"hello 1 2 3"}],"final":true}],"result_index":0} 

O cuando hablado durante demasiado tiempo, tengo un HTML 404, como a continuación:

<html><title>Error 400 (Bad Request)!!1</title></html> 

Y cuando hablé galimatías, lo tengo:

{"result":[]} 

Así para analizar toda esa respuesta, utilicé el siguiente código:

NSString *msg = @"Could not synthesize !"; 

    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"responseString: %@",responseString); 
    if([responseString containsString:@"transcript"]&&responseString.length>25) 
    { 

     responseString = [responseString stringByReplacingOccurrencesOfString:@"{\"result\":[]}" withString:@""]; 

     NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil]; 

     if(dictionary!=nil) 
      if(dictionary.allValues.count>0) 
      { 

       NSArray *array =[dictionary valueForKeyPath:@"result.alternative.transcript"]; 

       if(array) 
       { 
        NSArray *array2 = [array objectAtIndex:0]; 
        if(array2) 
        { 
         NSLog(@"%@",[array2 objectAtIndex:0]); 
         msg = [array2 objectAtIndex:0]; 
        }; 
       } 
      } 
    } 

    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Google Response" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [alert show]; 

Espero que esto ayude a alguien.

+0

En anterior a iOS8, la línea 'if ([responseString containsString: @" transcript "] && responseString.length> 25)' debe cambiarse a lo siguiente: 'if ([responseString rangeOfString: @ "transcript" options: NSCaseInsensitiveSearch] .location! = NSNotFound && responseString.length> 25) ' –

Cuestiones relacionadas