Problema com retorno acentos JSON + Rest + DataSnap

JSON

11/10/2017

Boa tarde pessoal, estou com problema para retorno de caracteres especiais, fazendo uso datasnap + rest no delphi retornando em JSON, por exemplo.

http://localhost:8098/datasnap/rest/TControllerServico/EchoString/Caçador

Ele me retorna ao consumir um JSON:
{"result":["Ca\\u00E7ador"]}

No rest debuger ele exibe corretamente

{
"result":
[
"Caçador"
]
}

Sou novato no uso desta, existe alguma forma de eu retornar já no formato de acentuação ansi?
Desculpe derrepente haver outro tópico ser semelhante a outros mas não encontrei. Ficarei muito grato se puderem me dar um help.
Anderson Amaral

Anderson Amaral

Curtidas 0

Respostas

Ermesom Lourenco

Ermesom Lourenco

11/10/2017

Não uso propriamente o DataSnap, mas quando fui fazer algo semelhante com Indy tive o mesmo problema. Acontece que cada quebra de linha ou batulações no Delphi são identificadas com caracteres especiais, de modo que ao transmitir o JSON dá alguns erros no navegador. Para isso resolvi da seguinte forma:

retorno.mensagem := StringReplace(retorno.mensagem, #$D#$A, '\\n', [rfReplaceAll, rfIgnoreCase]);

Ou seja, mapeando cada um deles.
Outro problema é este que está citando, que é o de acentos e ç, neste caso bastou converter tudo para utf-8 que resolveu:

Resposta.CharSet := 'utf-8';

Espero ter ajudado.
GOSTEI 0
Anderson Amaral

Anderson Amaral

11/10/2017

Boa tarde Ermesoml, com certeza ajuda sempre, qualquer comentário inerente ao assunto, situações de possível solução, mesmo que não seja identico a solução nos ajuda a ver as vezes também sob outros ângulos o problema.
Com base no que comentaste pelo que verifiquei me parece que a codificação que ele faz exemplo: \\u00c7 corresponde ao charset UTF-7 de acordo com a w3.org, pelo que interpretei, conforme link abaixo:
https://www.w3.org/People/danield/unic/unitra.htm

Desta forma identifiquei no meu DSHTTPService - o evento: ONHTTPTrace, e nele incluí uma conversão manual no braço com stringreplace que sugeriu trocando cada letra por exemplo \\u00c7 para Ç e assim por diante, que aparentemente resolveu meu problema. Contudo, apenas trocando o CharSet no mesmo evento, com uso de:
AResponse.ContentType:= 'application/json; charset=utf-32' não resolveu.

Daqui a pouco pode ser em outro evento ou propriedade que tenha que interagir que pela minha pouca experiência neste contexto desconheça. Se alguem tiver uma sugestão melhor também ficarei muito grato pela contribuição e será sempre bem vinda.

De qualquer forma, meu problema aparentemente resolvido meu problema Ermesoml, muitíssimo obrigado pela tua contribuição, abraços!
GOSTEI 0
Anderson Amaral

Anderson Amaral

11/10/2017

Boa tarde Ermesoml, com certeza ajuda sempre, qualquer comentário inerente ao assunto, situações de possível solução, mesmo que não seja identico a solução nos ajuda a ver as vezes também sob outros ângulos o problema.
Com base no que comentaste pelo que verifiquei me parece que a codificação que ele faz exemplo: \\\\\\\\u00c7 corresponde ao charset UTF-7 de acordo com a w3.org, pelo que interpretei, conforme link abaixo:
https://www.w3.org/People/danield/unic/unitra.htm

Desta forma identifiquei no meu DSHTTPService - o evento: ONHTTPTrace, e nele incluí uma conversão manual no braço com stringreplace que sugeriu trocando cada letra por exemplo \\\\\\\\u00c7 para Ç e assim por diante, que aparentemente resolveu meu problema. Contudo, apenas trocando o CharSet no mesmo evento, com uso de:
AResponse.ContentType:= ''application/json; charset=utf-8'' não resolveu.

Daqui a pouco pode ser em outro evento ou propriedade que tenha que interagir que pela minha pouca experiência neste contexto desconheça. Se alguem tiver uma sugestão melhor também ficarei muito grato pela contribuição e será sempre bem vinda.

De qualquer forma, meu problema aparentemente resolvido meu problema Ermesoml, muitíssimo obrigado pela tua contribuição, abraços!
GOSTEI 0
POSTAR