Al crear datos JSON manualmente, ¿cómo debo escapar de los campos de cadena? ¿Debo usar algo así como de Apache Commons Lang StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
o debo usar java.net.URLEncoder
?
El problema es que cuando lo uso SEU.escapeHtml
, no escapa a las comillas y cuando envuelvo toda la cadena en un par de '
s, se generará un JSON con formato incorrecto.
'
, está condenado desde el principio: las cadenas JSON solo se pueden rodear"
. Ver ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
esquema. Es muy útil.Respuestas:
Idealmente, encuentre una biblioteca JSON en su idioma en la que pueda alimentar una estructura de datos adecuada y deje que se preocupe por cómo escapar de las cosas . Te mantendrá mucho más sano. Si por alguna razón no tiene una biblioteca en su idioma, no quiere usar una (no sugeriría esto¹), o está escribiendo una biblioteca JSON, siga leyendo.
Escápelo de acuerdo con la RFC. JSON es bastante liberal: Los únicos caracteres que debe escapar son
\
,"
y los códigos de control (nada menos que U + 0020).Esta estructura de escape es específica de JSON. Necesitará una función específica de JSON. Todos los escapes se pueden escribir como
\uXXXX
dóndeXXXX
está la unidad de código UTF-16 para ese carácter. Hay algunos atajos, como por ejemplo\\
, que también funcionan. (Y dan como resultado una salida más pequeña y más clara).Para más detalles, vea el RFC .
El escape de JSON se basa en JS, por lo que utiliza
\uXXXX
, dondeXXXX
está una unidad de código UTF-16. Para puntos de código fuera del BMP, esto significa codificar pares sustitutos, lo que puede ser un poco complicado. (O bien, puede simplemente generar el carácter directamente, ya que JSON está codificado para texto Unicode y permite estos caracteres en particular).fuente
"
).{[]}:?
no se deben escapar con una barra invertida simple. (\:
por ejemplo, no es válido en una cadena JSON). Todos estos pueden escaparse opcionalmente utilizando la\uXXXX
sintaxis, con el desperdicio de varios bytes. Ver §2.5 del RFC.JSON.stringify()
hacer el trabajo.Extracto de Jettison :
fuente
"
,\
y los caracteres de control (los anteriores a "") son válidos dentro de las cadenas JSON siempre que la codificación de salida coincida. En otras palabras, no necesita codificar "펍" mientras\uD38D
se conserve la codificación UTF.Intenta esto
org.codehaus.jettison.json.JSONObject.quote("your string")
.Descárguelo aquí: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
fuente
org.json.simple.JSONObject.escape () escapa entre comillas, \, /, \ r, \ n, \ b, \ f, \ ty otros caracteres de control. Se puede usar para escapar de los códigos JavaScript.
fuente
Apache commons lang ahora es compatible con esto. Solo asegúrese de tener una versión suficientemente reciente de Apache commons lang en su classpath. Necesitarás la versión 3.2+
Notas de la versión para la versión 3.2
LANG-797: Se agregó escape / unescapeJson a StringEscapeUtils.
fuente
/
caracteres. Esto rompe muchas cosas, incluido JSON con URL en él. La propuesta original tenía/
un carácter especial para escapar, pero este ya no es el caso, como podemos ver en la última especificación al momento de escribirorg.json.JSONObject
quote(String data)
método hace el trabajoExtracto de la documentación:
fuente
org.apache.sling.commons.json.JSONObject
también tiene esta misma cosaStringEscapeUtils.escapeJavaScript
/StringEscapeUtils.escapeEcmaScript
Debe hacer el truco también.fuente
escapeJavaScript
escapa a comillas simples como\'
, lo cual es incorrecto.Si está usando fastexml jackson, puede usar lo siguiente:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Si está usando codehaus jackson, puede usar lo siguiente:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
fuente
No estoy seguro de lo que quieres decir con "crear json manualmente", pero puedes usar algo como gson ( http://code.google.com/p/google-gson/ ), y eso transformaría tu HashMap, Array, String, etc. , a un valor JSON. Recomiendo ir con un marco para esto.
fuente
No he pasado el tiempo para asegurarme al 100%, pero funcionó para mis entradas lo suficiente como para ser aceptado por los validadores JSON en línea:
aunque no se ve mejor que
org.codehaus.jettison.json.JSONObject.quote("your string")
Ya utilizo las herramientas de velocidad en mi proyecto: mi construcción "manual JSON" estaba dentro de una plantilla de velocidad
fuente
Para aquellos que vinieron aquí buscando una solución de línea de comandos, como yo, cURL's --data-urlencode funciona bien:
envía
, por ejemplo. Los datos JSON más grandes se pueden colocar en un archivo y usaría la sintaxis @ para especificar un archivo para sorber los datos que se van a escapar. Por ejemplo, si
usarías
Y ahora, este también es un tutorial sobre cómo consultar Freebase desde la línea de comandos :-)
fuente
Utilice la clase EscapeUtils en la API de commons lang.
fuente
Considere la clase JsonWriter de Moshi . Tiene una API maravillosa y reduce la copia al mínimo, todo se puede transmitir a un archivo, OutputStream, etc.
Si quieres la cuerda en la mano:
fuente
Apache commons-text ahora tiene un StringEscapeUtils.escapeJson (String) .
fuente
Si necesita escapar de JSON dentro de la cadena JSON, use org.json.JSONObject.quote ("su cadena json que necesita escapar") parece funcionar bien
fuente
utilizando la sintaxis \ uXXXX puede resolver este problema, google UTF-16 con el nombre del signo, puede encontrar XXXX, por ejemplo: comillas dobles utf-16
fuente
Los métodos aquí que muestran la implementación real son todos defectuosos.
No tengo código Java, pero solo para el registro, puede convertir fácilmente este código C #:
Cortesía del proyecto mono @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Esto se puede compactar en
fuente
quote()
defectuoso el método descrito en otras respuestas?Creo que la mejor respuesta en 2017 es usar las API javax.json. Use javax.json.JsonBuilderFactory para crear sus objetos json, luego escriba los objetos usando javax.json.JsonWriterFactory. Muy buena combinación de constructor / escritor.
fuente