我正在使用谷歌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}
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法如何得到这样的东西:
"{commands=\"ls -laF\\ndu -h\", id=0, timeout=0}"
Run Code Online (Sandbox Code Playgroud)
我不想重新发明轮子,所以如果可能的话,我想使用Jackson或现有的API.
Bar*_*ett 26
无需额外的依赖项:您正在寻找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}"
Run Code Online (Sandbox Code Playgroud)
参考:http://fasterxml.github.io/jackson-core/javadoc/2.1.0/com/fasterxml/jackson/core/io/JsonStringEncoder.html
事实证明,用于Gson序列化非常简单且无懈可击。commons-lang3 = 3.1 escapeEcmaScript之后使用Apache 。里面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);
}
}
Run Code Online (Sandbox Code Playgroud)
这会生成转义的 JSON:
{\"commands\":\"ls -laF\\ndu -h\"}
Run Code Online (Sandbox Code Playgroud)
反序列化就非常简单:
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);
}
Run Code Online (Sandbox Code Playgroud)
方法escapeEcmaScript并不复杂,就是进行如下替换:
{"'", "\\'"},
{"\"", "\\\""},
{"\\", "\\\\"},
{"/", "\\/"}
Run Code Online (Sandbox Code Playgroud)
但至少是我不必关心的事情。
| 归档时间: |
|
| 查看次数: |
26958 次 |
| 最近记录: |