简体   繁体   中英

Jackson not escaping quotes in JSON

I'm trying to put a json in a javascript file in java, but when I write the json to a string, the string doesn't appear to be a valid json for javascript; it is missing some escapes. (This is happening in a string in the json which I formatted as a faux json.)

For example, this would be a valid json in my javascript file:

{
   "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\"}, ]"
}

Here's what I get, though, where the double quotes aren't escaped:

{
   "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"}, ]"
}

I get the second result when I do this:

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

But when I write it directly to a file with jackson, I get the first, good result:

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

So why does jackson escape differently when writing to a file, and how do I get it to escape like that for me when writing to a string?

The writeValue() methods of the ObjectWriter class encode the input text.

You don't need to write to a file. An alternative approach for getting the same string could be:

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

I added

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

which escapes all the escape characters. That way when I write it to file and it removes the escapes, I still have the escapes I need. So turns out my real question was how to write to file without Java escapes being removed.

I'm very late to the party but I faced a similar problem and I realized it was not a problem with Jackson or my data. It was Java. I was reading from a JSON file and then trying to write it into a template HTML file.

I had a line my original JSON like yours, something like:

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

And when I wrote the above to a string, the backslash before the quotes in abc and value disappeared. I noticed that the contextual help for String.replaceAll mentioned something about Matcher.quoteReplacement. I went from this:

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

to this:

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

Problem solved.

Matcher.quoteReplacement

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM