Como descobrir por que o nsmutabledata é inválido
-
20-09-2019 - |
Pergunta
Acessar um URL repousante e recuperar os resultados. Os resultados estão em JSON. Eu transformo a resposta em uma string via:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *json = [[NSString alloc] initWithBytes:[self.receivedData mutableBytes] length:[self.receivedData length] encoding:NSUTF8StringEncoding];
A variável JSON tem um valor de 0x0. Quando eu rato sobre isso, eu vejo <Invalid CFStringRef
>. Como posso depurar isso para dizer por que é inválido? Renderizo o JSON devolveu o navegador em um analisador JSON. Isso verifica bem.
Os resultados são devolvidos digitando um ID no URL. Outros IDs retornam os resultados sem problemas. O conjunto de resultados é bastante grande.
Solução
Primeiro eu usaria initWithData:encoding:
Para configurar o NSString. Pequena diferença, mas esse método existe por uma razão.
Então, eu faria um hexdump de self.receivedData
Para ver o que está realmente lá. Se esses dados não forem adequadamente UTF8 codificados, então o initWithData:encoding:
vai falhar.
(Google para o NSDATA Hex Dump para encontrar as funções de utilidade de outras pessoas para fazer isso)
Descobri que às vezes os serviços da Web são desleixados com a codificação deles. Então, geralmente implemento um fallback como este:
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];
}
}
É meio triste que isso seja necessário, mas muitos serviços da Web não estão escritos ou configurados corretamente.
Outras dicas
Usar NSLog
olhar para os bytes.