Reputation: 32388
I'm using Google's com.google.api.client.json.GenericJson
and com.fasterxml.jackson.core.JsonGenerator
. I would like to serialize JSON object and escape quotes and backslashes so that I can pass that string in Bash. And afterwards deserialize that string.
GenericJson.toString
produces simple JSON, but \n
etc. are not escaped:
{commands=ls -laF\ndu -h, id=0, timeout=0}
is there a simple way how to get something like this:
"{commands=\"ls -laF\\ndu -h\", id=0, timeout=0}"
I don't want to reinvent the wheel, so I'd like to use Jackson or an existing API, if possible.
Upvotes: 17
Views: 41991
Reputation: 5948
No additional dependencies needed: You're looking for JsonStringEncoder#quoteAsString(String)
.
Click for JsonStringEncoder javadoc
import com.fasterxml.jackson.core.io.JsonStringEncoder;
JsonStringEncoder e = JsonStringEncoder.getInstance();
String commands = "ls -laF\\ndu -h";
String encCommands = new String(e.quoteAsString(commands));
String o = "{commands: \"" + encCommands + "\", id: 0, timeout: 0}"
Upvotes: 44
Reputation: 32388
Using Gson
for serialization proved to be quite easy and bulletproof. Afterwards Apache's commons-lang3 = 3.1
escapeEcmaScript
is used. In 3.2
there's also escapeJson
method.
import com.google.api.client.json.GenericJson;
import com.google.api.client.util.Key;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringEscapeUtils;
public class MyJson extends GenericJson {
@Key("commands")
public String commands;
public String serialize() throws IOException {
Gson gson = new Gson();
String g = gson.toJson(this);
return StringEscapeUtils.escapeEcmaScript(g);
}
}
This produces escaped JSON:
{\"commands\":\"ls -laF\\ndu -h\"}
Deserialization is then quite simple:
protected MyJson deserialize(String str) throws IOException {
String json = StringEscapeUtils.unescapeEcmaScript(str);
JsonObjectParser parser = (new JacksonFactory()).createJsonObjectParser();
return parser.parseAndClose(new StringReader(json), MyJson.class);
}
The escapeEcmaScript
method isn't complicated, it does following replacement:
{"'", "\\'"},
{"\"", "\\\""},
{"\\", "\\\\"},
{"/", "\\/"}
But at least is something I don't have to care about.
Upvotes: 5