Lors de la création manuelle de données JSON, comment dois-je échapper aux champs de chaîne? Dois - je utiliser quelque chose comme Apache Commons Lang StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
ou devrais - je utiliser java.net.URLEncoder
?
Le problème est que lorsque j'utilise SEU.escapeHtml
, il n'échappe pas les guillemets et lorsque j'enroule toute la chaîne dans une paire de '
s, un JSON mal formé sera généré.
'
, vous êtes condamné dès le début: les chaînes JSON ne peuvent être entourées que de"
. Voir ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
contour. C'est assez utile.Réponses:
Idéalement, trouvez une bibliothèque JSON dans votre langage dans laquelle vous pouvez alimenter une structure de données appropriée et laissez-la s'inquiéter de la façon d'échapper aux choses . Cela vous gardera beaucoup plus sain d'esprit. Si pour une raison quelconque vous n'avez pas de bibliothèque dans votre langue, vous ne voulez pas en utiliser une (je ne le suggérerais pas), ou vous écrivez une bibliothèque JSON, lisez la suite.
Échappez-vous selon la RFC. JSON est assez libérale: Les seuls caractères que vous devez échapper sont
\
,"
et les codes de contrôle (rien de moins que U + 0020).Cette structure d'échappement est spécifique à JSON. Vous aurez besoin d'une fonction spécifique JSON. Tous les échappements peuvent être écrits comme
\uXXXX
oùXXXX
est l'unité de code UTF-16¹ pour ce caractère. Il existe quelques raccourcis, tels que\\
, qui fonctionnent également. (Et ils se traduisent par une sortie plus petite et plus claire.)Pour plus de détails, consultez la RFC .
L'échappement de ¹JSON est construit sur JS, il utilise donc
\uXXXX
, oùXXXX
est une unité de code UTF-16. Pour les points de code en dehors du BMP, cela signifie encoder des paires de substitution, qui peuvent devenir un peu velues. (Ou, vous pouvez simplement afficher le caractère directement, puisque JSON encodé pour est du texte Unicode, et autorise ces caractères particuliers.)la source
"
).{[]}:?
ne doivent pas être échappés avec une seule barre oblique inverse. (\:
par exemple, n'est pas valide dans une chaîne JSON.) Tous ceux-ci peuvent éventuellement être échappés à l'aide de la\uXXXX
syntaxe, au détriment de plusieurs octets. Voir §2.5 de la RFC.JSON.stringify()
fait le travail.Extrait de Jettison :
la source
"
,\
et les caractères de contrôle (ceux précédant «») sont valides dans les chaînes JSON tant que l'encodage de sortie correspond. En d'autres termes, vous n'avez pas besoin d'encoder «펍» tant\uD38D
que l'encodage UTF est conservé.Essayez ceci
org.codehaus.jettison.json.JSONObject.quote("your string")
.Téléchargez-le ici: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
la source
org.json.simple.JSONObject.escape () échappe les guillemets, \, /, \ r, \ n, \ b, \ f, \ t et d'autres caractères de contrôle. Il peut être utilisé pour échapper aux codes JavaScript.
la source
Apache commons lang prend désormais en charge cela. Assurez-vous simplement d'avoir une version assez récente d'Apache commons lang sur votre chemin de classe. Vous aurez besoin de la version 3.2+
Notes de version pour la version 3.2
LANG-797: Ajout de escape / unescapeJson à StringEscapeUtils.
la source
/
caractères. Cela casse beaucoup de choses, y compris JSON avec des URL. La proposition originale avait/
comme caractère spécial pour s'échapper, mais ce n'est plus le cas, comme nous pouvons le voir dans la dernière spécification au moment de la rédaction de cet articleorg.json.JSONObject
quote(String data)
la méthode fait le travailExtrait de la documentation:
la source
org.apache.sling.commons.json.JSONObject
a aussi la même choseStringEscapeUtils.escapeJavaScript
/StringEscapeUtils.escapeEcmaScript
devrait faire l'affaire aussi.la source
escapeJavaScript
échappe les guillemets simples comme\'
, ce qui est incorrect.Si vous utilisez fastexml jackson, vous pouvez utiliser ce qui suit:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Si vous utilisez codehaus jackson, vous pouvez utiliser les éléments suivants:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
la source
Je ne sais pas ce que vous entendez par "créer json manuellement", mais vous pouvez utiliser quelque chose comme gson ( http://code.google.com/p/google-gson/ ), et cela transformerait votre HashMap, votre tableau, votre chaîne, etc. , à une valeur JSON. Je recommande d'aller avec un cadre pour cela.
la source
Je n'ai pas passé le temps à m'en assurer à 100%, mais cela a suffisamment fonctionné pour mes entrées pour être accepté par les validateurs JSON en ligne:
bien que cela ne soit pas meilleur que
org.codehaus.jettison.json.JSONObject.quote("your string")
J'utilise déjà simplement des outils de vélocité dans mon projet - ma construction "JSON manuelle" était dans un modèle de vélocité
la source
Pour ceux qui sont venus ici à la recherche d'une solution en ligne de commande, comme moi, --data-urlencode de cURL fonctionne bien:
envoie
, par exemple. Des données JSON plus volumineuses peuvent être placées dans un fichier et vous utiliserez la syntaxe @ pour spécifier un fichier à insérer dans les données à échapper. Par exemple, si
vous utiliseriez
Et maintenant, c'est aussi un tutoriel sur la façon d'interroger Freebase à partir de la ligne de commande :-)
la source
Utilisez la classe EscapeUtils dans l'API lang commun.
la source
Considérez la classe JsonWriter de Moshi . Il a une merveilleuse API et réduit la copie au minimum, tout peut être joliment diffusé dans un fichier, OutputStream, etc.
Si vous voulez la chaîne en main:
la source
Apache commons-text a maintenant un StringEscapeUtils.escapeJson (String) .
la source
Si vous avez besoin d'échapper au JSON dans la chaîne JSON, utilisez org.json.JSONObject.quote ("votre chaîne json qui doit être échappée") semble bien fonctionner
la source
en utilisant la syntaxe \ uXXXX peut résoudre ce problème, google UTF-16 avec le nom du signe, vous pouvez trouver XXXX, par exemple: utf-16 guillemet double
la source
Les méthodes ici qui montrent l'implémentation réelle sont toutes défectueuses.
Je n'ai pas de code Java, mais juste pour mémoire, vous pouvez facilement convertir ce code C #:
Gracieuseté du mono-projet @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Cela peut être compacté en
la source
quote()
méthode décrite dans les autres réponses est-elle défectueuse?Je pense que la meilleure réponse en 2017 est d'utiliser les API javax.json. Utilisez javax.json.JsonBuilderFactory pour créer vos objets json, puis écrivez les objets à l'aide de javax.json.JsonWriterFactory. Très belle combinaison constructeur / écrivain.
la source