Como lidar com aspas duplas no valor JSON?

Sep 22 2020

Eu tenho uma string que recebo como uma resposta HTTP. Infelizmente, a string está em um formato bruto e não consigo convertê-la no objeto JSON.

String de exemplo:

json_string = '{"client_id":8888,"time":null,"questions":{"id":10000,"answered":"true","answer":"The "project" was good, I enjoyed it. Do you plan to repeat it?"},"other":"When is the "project" released?"}'

O problema com a string é que ela contém aspas duplas em alguns dos valores (respostas do usuário). As chaves dos valores que podem conter aspas duplas nem sempre são as mesmas (aqui "responder" e "outro" podem ser diferentes em outras respostas). A resposta do usuário pode conter qualquer caractere (vírgulas, colchetes, aspas duplas, ...).

Tentei usar carregadores diferentes (json, yaml) e até tentei analisar a string sozinho com regexp, mas sempre falhei.

Existe alguma maneira de como converter essa string em objeto JSON?

Respostas

3 MarkReed Sep 22 2020 at 20:58

Para ser claro, a solução correta aqui seria consertar o que quer que esteja enviando essa resposta HTTP; a maneira correta de incluir aspas duplas em uma string JSON é fazer uma barra invertida:

{ "key": "value with \"double quotes\" inside" }

Qualquer analisador JSON deve aceitar o acima como um objeto válido.

Você não pode analisar algo com aspas sem escape de maneira confiável porque não pode dizer quais são os delimitadores de string reais e quais são os dados incluídos. Se você puder supor que as aspas estão equilibradas (portanto, sempre há um número par de aspas dentro de qualquer string), você poderia construir um analisador para transformá-lo na sintaxe correta, mas não será uma correção simples baseada em regex.

Dito isso, com seus dados de amostra, parece que as aspas incorporadas estão entre espaços e as aspas delimitadoras reais não. Portanto, você pode tentar substituí-lo por "(aspas de espaço) por \"(espaço-barra invertida-aspas) e " (aspas-espaço) por \" (barra invertida-aspas-espaço) e ver se funciona.