web-dev-qa-db-fra.com

Jackson n'échappe pas aux citations en JSON

J'essaie de mettre un json dans un fichier javascript en Java, mais lorsque j'écris le json dans une chaîne, cette chaîne ne semble pas être un json valide pour javascript; il manque quelques évasions. (Cela se passe dans une chaîne du json que j'ai formatée comme un faux json.)

Par exemple, ce serait un json valide dans mon fichier javascript:

{
   "message": 
   "the following books failed: [{\"book\": \"The Horse and his Boy\",\"author\": \"C.S. Lewis\"}, {\"book\": \"The Left Hand of Darkness\",\"author\": \"Ursula K. le Guin\"}, ]"
}

Voici ce que j'ai, cependant, où les guillemets ne sont pas échappés:

{
   "message": 
   "The following books failed: [{"book": "The Horse and his Boy","author": "C.S. Lewis"}, {"book": "The Left Hand of Darkness","author": "Ursula K. le Guin"}, ]"
}

J'obtiens le deuxième résultat quand je fais ceci:

new ObjectMapper().writer().writeValueAsString(booksMessage);

Mais quand je l'écris directement dans un fichier avec jackson, j'obtiens le premier, bon résultat:

new ObjectMapper().writer().writeValue(fileToWriteTo, booksMessage);

Alors, pourquoi Jackson s’échappe-t-il différemment lors de l’écriture dans un fichier, et comment puis-je le faire échapper ainsi pour moi lors de l’écriture dans une chaîne?

14
CorayThan

J'ai ajouté 

booksJson = Pattern.compile("\\\\").matcher(booksJson).replaceAll("\\\\\\\\");

qui échappe à tous les personnages d'échappement. Ainsi, lorsque je l’écris dans un fichier et qu’il supprime les fuites, j’ai toujours les fuites dont j’ai besoin. Ainsi, ma vraie question était de savoir comment écrire dans un fichier sans supprimer les échappements Java.

2
CorayThan

Les méthodes writeValue() de la classe ObjectWriter codent le texte d'entrée.

Vous n'avez pas besoin d'écrire dans un fichier. Une approche alternative pour obtenir la même chaîne pourrait être:

StringWriter sw = new StringWriter();
new ObjectMapper().writer().writeValue(sw, booksMessage);
String result = sw.toString();
5
PNS

Je suis très en retard pour la fête, mais j'ai rencontré un problème similaire et j'ai réalisé que ce n'était pas un problème avec Jackson ou mes données. C'était Java. Je lisais un fichier JSON, puis j'essayais de l'écrire dans un fichier HTML modèle.

J'ai eu une ligne mon JSON d'origine comme la vôtre, quelque chose comme:

{"field" : "This field contains what looks like another JSON field: {\"abc\": \"value\"}"}

Et quand j'ai écrit ce qui précède dans une chaîne, la barre oblique inverse avant les guillemets dans abc et la valeur a disparu. J'ai remarqué que l'aide contextuelle de String.replaceAll mentionnait quelque chose à propos de Matcher.quoteReplacement. Je suis parti de ça:

template = template.replaceAll("%template%", jsonDataString);

pour ça:

Pattern pattern = Pattern.compile("%template%");
Matcher matcher = Pattern.matcher(template);
matcher.replaceAll(matcher.quoteReplacement(jsonDataString));

Problème résolu.

Matcher.quoteReplacement

0
dnuttle