Come trovare il motivo per cui non è valido NSMutableData
-
20-09-2019 - |
Domanda
I accedere a un URL riposante e tornare risultati. I risultati sono in JSON. Mi giro la risposta in una stringa tramite:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *json = [[NSString alloc] initWithBytes:[self.receivedData mutableBytes] length:[self.receivedData length] encoding:NSUTF8StringEncoding];
La variabile json ha un valore di 0x0. Quando ho mouse su di esso, vedo <Invalid CFStringRef
>. Come posso eseguire il debug di questo per dire il motivo per cui non è valido? I rendere il JSON restituito tramite il browser in un parser JSON. Che controlla bene.
I risultati sono restituiti inserendo un ID nell'URL. Altri ID restituiscono i risultati senza alcun problema. Il set di risultati è abbastanza grande.
Soluzione
Per prima cosa vorrei usare initWithData:encoding:
per impostare il NSString. Piccola differenza, ma questo metodo è lì per un motivo.
Poi, vorrei fare un hexdump di self.receivedData
per vedere che cosa è in realtà in là. Se i dati non è correttamente UTF8 codificata poi il initWithData:encoding:
fallirà.
(Google per NSData dump esadecimale per trovare funzioni di utilità di altre persone per fare questo)
Ho scoperto che a volte i servizi web sono sciatta con la loro codifica. Così io di solito attuare un ripiego in questo modo:
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];
}
}
E 'un po' triste che questo è richiesta ma molti servizi web non sono scritti o configurato correttamente.
Altri suggerimenti
Utilizza NSLog
a guardare il byte.