2012-02-04 12 views
5

Actualmente estoy experimentando con el uso de JSON para la transferencia de datos de Internet. He tenido éxito al recibir una cadena JSON y convertirla en NSDictionary, pero no he podido averiguar cómo convertir una matriz o diccionario de objetos en una representación JSON.Objective-C/iOS: conversión de una matriz de objetos a cadena JSON

He leído una serie de publicaciones y artículos que explican cómo crear un NSDictionary de pares clave/valor y luego convertir a JSON, que funciona bien para una matriz simple, pero ¿cómo lograr esto cuando tienes una matriz o diccionario de objetos.

Así, por ejemplo, tengo una matriz de objetos "contacto", que Después me gustaría transformarse en una cadena JSON como tal:

"contacts":{ 
    "contact":[ 
    { 
     "id":"1" 
     "first_name":"john", 
     "last_name":"citizen", 
     "phone":"9999 9999" 
    } 
    { 
     "id":"1" 
     "first_name":"jane", 
     "last_name":"doe", 
     "phone":"8888 8888" 
    } 
    ] 
} 

Tengo un NSMutableDictionary que es rellenar una lista de contactos objetos:

NSMutableDictionary* contactsToBeSynced = [[NSMutableDictionary alloc] init]; 
    //Populate dictionary with contact objects. 
    contactsToBeSynced = self.getNonSynchronisedData; 

entonces tratar de transformar el diccionario de objetos con el método NSJSONSerialization, pero falla con un error.

NSError* error; 
    NSString* jsonString; 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:contactsToBeSynced options:NSJSONWritingPrettyPrinted error:&error]; 
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

¿Alguien ha podido hacer esto con éxito? Agradecería mucho alguna ayuda o un punto en la dirección correcta. Aclamaciones.

+0

¿Esto es para aprender o simplemente quieres hacer cosas? Porque hay alrededor de 5 buenas bibliotecas JSON para Objective-C. – user123444555621

Respuesta

5

Acerca de su estructura - su contactsToBeSynced deben ser de NSDictionary clase y contact debería haber una NSArray contiene NSDictionary objetos para diferentes contactos. Por cierto, ¿has probado JSONKit? Su serialización funciona mejor que el estándar NSJSONSerialization.

1

trabajé hacia fuera ...

He creado una NSArray de objetos de contacto y utilizar el marco SBJson con SBJsonWriter:

SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 
NSString *jsonString = [writer stringWithObject:arr]; 

que tiene una cadena JSON con una lista de contactos.

0

Compruebe mi respuesta a la pregunta '' SBJsonWriter Nested NSDictionary ''. ilustra cómo usar adecuadamente SBJsonWriter.

Incluye SBJsonWriter error checking! y algunas piezas de asesoramiento sobre el comportamiento SBJsonWriter con NSDate, flotador, etc ..

Extracto:

NSDictionary* aNestedObject = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"nestedStringValue", @"aStringInNestedObject", 
             [NSNumber numberWithInt:1], @"aNumberInNestedObject", 
           nil]; 

NSArray * aJSonArray = [[NSArray alloc] initWithObjects: @"arrayItem1", @"arrayItem2", @"arrayItem3", nil]; 

NSDictionary * jsonTestDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"stringValue", @"aString", 
            [NSNumber numberWithInt:1], @"aNumber", 
            [NSNumber numberWithFloat:1.2345f], @"aFloat", 
            [[NSDate date] description], @"aDate", 
            aNestedObject, @"nestedObject", 
            aJSonArray, @"aJSonArray", 
            nil]; 
0

En general, se escribe un método toDictionary para cada clase que tiene los campos de interés y los inserta en un diccionario. Para los campos numéricos, conviértalo a NSNumber antes de insertar. Si algún campo es un objeto, llame al método toDictionary en ese objeto e inserte el resultado en su diccionario. Si tiene una matriz de objetos, necesita escribir un bucle, pero no es nada exótico.

Para invertir la operación, escriba un método initWithDictionary para cada clase.

Cuestiones relacionadas