我正在使用Google的com.google.api.client.json.GenericJson
和com.fasterxml.jackson.core.JsonGenerator
。我想序列化JSON对象并转义引号和反斜杠,以便我可以在Bash中传递该字符串。然后反序列化该字符串。
GenericJson.toString
生成简单的JSON,但\n
等不会转义:
{commands=ls -laF\ndu -h, id=0, timeout=0}
有一种简单的方法可以得到这样的东西:
"{commands=\"ls -laF\\ndu -h\", id=0, timeout=0}"
我不想重新发明轮子,所以如果可能的话,我想使用Jackson或现有的API。
答案 0 :(得分:23)
无需其他依赖项:您正在寻找JsonStringEncoder#quoteAsString(String)
。
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}"
答案 1 :(得分:2)
使用Gson
进行序列化证明非常简单且无懈可击。然后使用Apache的commons-lang3 = 3.1
escapeEcmaScript
。在3.2
中,还有escapeJson
方法。
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);
}
}
这会生成转义的JSON:
{\"commands\":\"ls -laF\\ndu -h\"}
反序列化非常简单:
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);
}
escapeEcmaScript
方法并不复杂,它取代了以下方法:
{"'", "\\'"},
{"\"", "\\\""},
{"\\", "\\\\"},
{"/", "\\/"}
但至少是我不必关心的事情。