¿Cómo encontrar qué NSMutableData no es válido
-
20-09-2019 - |
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.
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.