Ao criar dados JSON manualmente, como devo escapar dos campos de sequência? Devo usar algo como Apache Commons Lang StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
ou eu deveria usarjava.net.URLEncoder
?
O problema é que, quando eu uso SEU.escapeHtml
, ele não escapa aspas e quando envolvo toda a string em um par de '
s, um JSON malformado será gerado.
'
, estará condenado desde o início: as cadeias JSON só podem ser cercadas"
. Veja ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
esboço. É bastante útil.Respostas:
Idealmente, encontre uma biblioteca JSON no seu idioma na qual você possa alimentar alguma estrutura de dados apropriada e deixe-a se preocupar com como escapar de coisas . Vai mantê-lo muito mais saudável. Se, por qualquer motivo, você não tiver uma biblioteca no seu idioma, não quiser usá-la (eu não sugeriria isso¹) ou estiver escrevendo uma biblioteca JSON, continue lendo.
Escape de acordo com a RFC. JSON é muito liberal: Os únicos caracteres que você deve escapar são
\
,"
e códigos de controle (nada menos do que U + 0020).Essa estrutura de escape é específica para JSON. Você precisará de uma função específica JSON. Todas as fugas podem ser escritas como
\uXXXX
ondeXXXX
está a unidade de código UTF-16¹ para esse caractere. Existem alguns atalhos, como\\
, que também funcionam. (E eles resultam em uma saída menor e mais clara.)Para detalhes completos, consulte o RFC .
O escape de JSON é construído em JS, então ele usa
\uXXXX
, ondeXXXX
está uma unidade de código UTF-16. Para pontos de código fora do BMP, isso significa codificar pares substitutos, o que pode ser um pouco complicado. (Ou, você pode simplesmente gerar o caractere diretamente, pois o JSON codificado para é texto Unicode e permite esses caracteres específicos.)fonte
"
).{[]}:?
não devem ser escapados com uma única barra invertida. (\:
por exemplo, não é válido em uma cadeia de caracteres JSON.) Todos esses itens podem opcionalmente ser escapados usando a\uXXXX
sintaxe, com desperdício de vários bytes. Veja §2.5 da RFC.JSON.stringify()
fazer o trabalho.Extrato do Jettison :
fonte
"
,\
, e caracteres de controlo (aqueles antes de “”) são cadeias dentro JSON válidos como partidas desde que a saída que codificam. Em outras palavras, você não precisa codificar “펍”\uD38D
enquanto a codificação UTF for preservada.Tente isso
org.codehaus.jettison.json.JSONObject.quote("your string")
.Faça o download aqui: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
fonte
org.json.simple.JSONObject.escape () escapa aspas, \, /, \ r, \ n, \ b, \ f, \ te outros caracteres de controle. Pode ser usado para escapar dos códigos JavaScript.
fonte
O Apache commons lang agora suporta isso. Apenas verifique se você tem uma versão recente o suficiente do Apache commons em seu caminho de classe. Você precisará da versão 3.2 ou superior
Notas de versão da versão 3.2
LANG-797: Adicionado escape / unescapeJson no StringEscapeUtils.
fonte
/
caracteres. Isso quebra muitas coisas, incluindo JSON com URLs. A proposta original tinha/
como um char especial para escapar, mas isso não é mais o caso, como podemos ver na mais recente especificação no momento da escritaorg.json.JSONObject
quote(String data)
método faz o trabalhoExtrair da documentação:
fonte
org.apache.sling.commons.json.JSONObject
também tem a mesma coisaStringEscapeUtils.escapeJavaScript
Eu tambémStringEscapeUtils.escapeEcmaScript
deveria fazer o truque.fonte
escapeJavaScript
escapa aspas simples como\'
, o que está incorreto.Se você estiver usando fastexml jackson, poderá usar o seguinte:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Se você estiver usando o codehaus jackson, poderá usar o seguinte:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
fonte
Não sei ao certo o que você quer dizer com "criando json manualmente", mas você pode usar algo como gson ( http://code.google.com/p/google-gson/ ), que transformaria seu HashMap, Array, String etc. , para um valor JSON. Eu recomendo ir com uma estrutura para isso.
fonte
Não gastei tempo para garantir 100% de certeza, mas funcionou para minhas entradas o suficiente para ser aceito pelos validadores JSON online:
embora não pareça melhor do que
org.codehaus.jettison.json.JSONObject.quote("your string")
Eu simplesmente já uso ferramentas de velocidade no meu projeto - meu edifício "manual JSON" estava dentro de um modelo de velocidade
fonte
Para aqueles que vieram aqui procurando uma solução de linha de comando, como eu, o --data-urlencode do cURL funciona bem:
envia
, por exemplo. Dados JSON maiores podem ser colocados em um arquivo e você usaria a sintaxe @ para especificar um arquivo a ser coletado nos dados a serem escapados. Por exemplo, se
você usaria
E agora, este também é um tutorial sobre como consultar o Freebase na linha de comando :-)
fonte
Use a classe EscapeUtils na API comum.
fonte
Considere a classe JsonWriter de Moshi . Possui uma API maravilhosa e reduz ao mínimo a cópia, tudo pode ser transmitido de maneira agradável para um arquivo, OutputStream etc.
Se você quer a corda na mão:
fonte
O texto comum do Apache agora possui um StringEscapeUtils.escapeJson (String) .
fonte
Se você precisar escapar do JSON dentro da string JSON, use org.json.JSONObject.quote ("sua string json que precisa ser escapada") parece funcionar bem
fonte
usando a sintaxe \ uXXXX pode resolver esse problema, google UTF-16 com o nome do sinal, você pode descobrir XXXX, por exemplo: utf-16 aspas duplas
fonte
Os métodos aqui que mostram a implementação real estão todos com defeito.
Eu não tenho código Java, mas apenas para o registro, você pode facilmente converter esse código C #:
Cortesia do mono-projeto @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Isso pode ser compactado em
fonte
quote()
método descrito em outras respostas está com defeito?Acho que a melhor resposta em 2017 é usar as APIs javax.json. Use javax.json.JsonBuilderFactory para criar seus objetos json e, em seguida, grave os objetos usando javax.json.JsonWriterFactory. Muito boa combinação de construtor / escritor.
fonte