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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top