2012-04-24 10 views
12

Estoy convirtiendo una serie de NSDictionaries de datos JSON con la siguiente ...conversión de NSArray -> JSON -> NSData -> servidor PHP -> representación JSON

Crear mis datos ...

NSMutableArray *arrayOfDicts = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 2; i++) { 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"MySong", @"title", 
            @"MyArtist", @"artist", 
            nil]; 
    [arrayOfDicts addObject:dict];   
} 
NSArray *info = [NSArray arrayWithArray:arrayOfDicts]; 
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info 
     options:NSJSONWritingPrettyPrinted error:&error]; 

continuación, enviar al igual que ...

NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.com/index.php"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:jsonData forKey:@"songs"]; 
    [request setDelegate:self]; 
    request.tag = TAG_LOAD_SONGS; 
    [request startAsynchronous]; 

Este es el envío de la NSData a mi servidor, pero ¿cómo puedo entonces lo usan en php ... es realmente sólo un montón de números aleatorios si lo imprimo desde mi servidor, y te he probado cantar json_encode pero no creo que eso signifique para datos sin procesar ...

¡Cualquier ayuda sería genial!

EDIT: Aquí es la respuesta de php ...

echo $_POST['songs']; 

<5b0a2020 7b0a2020 20202274 69746c65 22203a20 224d7953 6f6e6722 2c0a2020 20202261 72746973 7422203a 20224d79 41727469 7374220a 20207d2c 0a20207b 0a202020 20227469 746c6522 203a2022 4d79536f 6e67222c 0a202020 20226172 74697374 22203a20 224d7941 72746973 74220a20 207d0a5d> 

Aquí está la respuesta a NSLoging en Xcode ...

NSLog(@"Info: %@", info); 

Información: ( { artista = MyArtist ; title = MySong; }, { artist = MyArtist; title = MySong; } )

+0

¿Qué aspecto tiene la cadena que recibe en PHP? – deceze

+0

Bueno, eso ciertamente no es JSON. Parece un problema en la forma en que envías los datos, no uno con PHP. – deceze

+0

así que no puedo descifrar qué está mal entonces? Editaré mi pregunta con la forma en que creo mi objeto ... – Eric

Respuesta

20

Resulta que necesitaba hacerlo de esta manera:

para crear mi datos:

NSMutableArray *arrayOfDicts = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 2; i++) { 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"MySong", @"title", 
            @"MyArtist", @"artist", 
            nil]; 
    [arrayOfDicts addObject:dict];   
} 
NSArray *info = [NSArray arrayWithArray:arrayOfDicts]; 

y lo envió como esto:

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

    // Start request 
    NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.com/index.php"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:jsonString forKey:@"songs"]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 

La clave era convertir la información a NSData, luego a una Cadena JSON que envié a mi servidor, no solo enviando el NSData sin formato.

¡Gracias a todos por la ayuda!

+0

¿Por qué te conviertes? a NSData en primer lugar? Utilice la interfaz que le da una cadena de caracteres JSON en su lugar. –

+0

Ah, ya veo - la mala interfaz de Apple no tiene una interfaz que producirá una cadena JSON. –

+0

Sí, es bastante tonto ... Oh, bueno, es lo que obtengo por tratar de usar la implementación de Apples en lugar de simplemente usar una biblioteca de terceros! – Eric

1

<?php $array = json_decode($_POST['songs']); ?> debería funcionar.

+0

cuando echo $ array, nada se imprime ... Pero sé que estoy enviando datos ...porque cuando echo $ _POST ['songs'], obtengo una tonelada de números impresos ... – Eric

+0

¿Puedes pegar los números en esta pregunta ...? Además, pegue su objeto 'información' Obj-C usando, simplemente: 'NSLog (@"% @ ", información);' – QED

+0

Bueno, sus miles de líneas de datos ... Serían demasiado grandes para publicar. Básicamente, si imprimo esos mismos datos desde xcode en lugar de PHP, pero uso NSString * string = NSString * jsonString = [[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding]; Puedo ver la representación perfecta de json de los datos. – Eric

1

No puede enviarlo de esta manera. NSJSONSerialization es para el uso de iOS. Es básicamente un plist. Necesitarás una forma de descodificarlo en PHP y dudo que exista. En su lugar, debe enviar una cadena JSON. No estoy seguro de a qué te refieres con "deja citas entre títulos". ¿Qué están haciendo allí en primer lugar? ¿Puedes verificar tu cadena JSON original here?

+0

Ahora estoy enviando la cadena (pasa la validación) ... Pero la cadena se envía como ... [{"title": "MySong"}] y se recibe de php como [{\ "title \": \ " MySong \ "}] y creo que los" \ "están estropeando la decodificación? – Eric

+0

Creo que lo descubrí ... Utilizo json_decode (stripslashes ($ host_songs)) que elimina todas esas barras invertidas antes de decodificar .. – Eric

+0

Se está escapando. ¿Estás enviando esto a través de POST? Las citas no son URL seguras. Necesitas limpiar primero la cadena: Cambiar "a% 22 – borrrden

Cuestiones relacionadas