在 Java 中转义 JSON 字符串

2022-09-04 05:28:06

我正在使用谷歌和.我想序列化JSON对象并转义引号和反斜杠,以便我可以在Bash中传递该字符串。然后反序列化该字符串。com.google.api.client.json.GenericJsoncom.fasterxml.jackson.core.JsonGenerator

GenericJson.toString生成简单的 JSON,但等未转义:\n

{commands=ls -laF\ndu -h, id=0, timeout=0}

有没有一种简单的方法来获得这样的东西:

"{commands=\"ls -laF\\ndu -h\", id=0, timeout=0}"

我不想重新发明轮子,所以如果可能的话,我想使用Jackson或现有的API。


答案 1

无需其他依赖项:您正在寻找 .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}"

编号: http://fasterxml.github.io/jackson-core/javadoc/2.1.0/com/fasterxml/jackson/core/io/JsonStringEncoder.html


答案 2

用于序列化被证明是非常容易和防弹的。之后使用Apache。在还有方法。Gsoncommons-lang3 = 3.1escapeEcmaScript3.2escapeJson

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

  {"'", "\\'"},
  {"\"", "\\\""},
  {"\\", "\\\\"},
  {"/", "\\/"}

但至少是我不必担心的事情。