Pregunta

Me acceder a una URL descanso y volver resultados. Los resultados están en JSON. Giro la respuesta en una cadena a través de:

- (void)connectionDidFinishLoading:(NSURLConnection   *)connection {
NSString *json = [[NSString alloc] initWithBytes:[self.receivedData mutableBytes] length:[self.receivedData length] encoding:NSUTF8StringEncoding];

La variable JSON tiene un valor de 0x0. Cuando ratón sobre él, veo <Invalid CFStringRef>. ¿Cómo puedo depurar este a decir por qué no es válido? Me hacen el JSON devuelto a través del navegador en un analizador JSON. Que comprueba bien.

Los resultados se dan la espalda mediante la introducción de un ID en la URL. Otros identificadores devuelven resultados sin problema. El conjunto de resultados es bastante grande.

¿Fue útil?

Solución

En primer lugar me gustaría utilizar initWithData:encoding: para configurar la NSString. Pequeña diferencia, pero ese método está ahí por una razón.

A continuación, me gustaría hacer un volcado hexadecimal de self.receivedData para ver lo que realmente está allí. Si esos datos no está correctamente UTF8 codificada entonces el initWithData:encoding: fallará.

(Google para NSData volcado hexadecimal para encontrar las funciones de utilidad de otras personas para hacer esto)

He encontrado que a veces los servicios web son descuidados con su codificación. Por lo que suelen poner en práctica un repliegue de esta manera:

NSString* html = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
if (html == nil) {
    html = [[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding];
    if (html == nil) {
        html = [[NSString alloc] initWithData: data encoding: NSMacOSRomanStringEncoding];
    }
}

Es un poco triste que esto es necesario, pero muchos servicios web que no están escritas o configurado correctamente.

Otros consejos

Utilice NSLog mirar los bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top