TL;DR:
详细说明:
我用我拥有的库进行了测试,然后我发现我不能同意接受的答案。我的是2.9。
就我而言,toString() 不仅仅是添加引号。它还将保留字符串内容中的转义字符,至少从版本 2.0 到 2.9。
查看来源here(注意网址中的版本,可以在页面中选择版本,直到2.10)
2.0:
/**
* Different from other values, Strings need quoting
*/
@Override
public String toString()
{
int len = _value.length();
len = len + 2 + (len >> 4);
StringBuilder sb = new StringBuilder(len);
appendQuoted(sb, _value);
return sb.toString();
}
protected static void appendQuoted(StringBuilder sb, String content)
{
sb.append('"');
CharTypes.appendQuoted(sb, content);
sb.append('"');
}
fasterxml.jackson.core.io.CharTypes.appendQuoted() 将保留一些转义字符。在here查看它的源代码。(注意代码来自2.0分支,不是master)
public static void appendQuoted(StringBuilder sb, String content)
{
final int[] escCodes = sOutputEscapes128;
int escLen = escCodes.length;
for (int i = 0, len = content.length(); i < len; ++i) {
char c = content.charAt(i);
if (c >= escLen || escCodes[c] == 0) {
sb.append(c);
continue;
}
sb.append('\\');
int escCode = escCodes[c];
if (escCode < 0) { // generic quoting (hex value)
// We know that it has to fit in just 2 hex chars
sb.append('u');
sb.append('0');
sb.append('0');
int value = -(escCode + 1);
sb.append(HEX_CHARS[value >> 4]);
sb.append(HEX_CHARS[value & 0xF]);
} else { // "named", i.e. prepend with slash
sb.append((char) escCode);
}
}
}
但是,正如接受的答案所说,现在master 分支似乎将此行为简化为“仅添加引号”。这可以在this page 中看到。实际上,这个提交的标题是
移除对 CharTypes.appendQuoted() 的依赖;将 JsonNode.toString() 的引号更改为单引号,以防止用于 JSON 生成
但同样,我使用的是 2.9,而CharTypes.appendQuoted() 仍在使用。因此,通常情况下,如果您不使用 master 分支,toString() 将保留转义字符。
例子:
JsonNode node = new TextNode("{\"en_us\":\"54\",\"es_es\":\"54\"}");
node.asText(); // -> {"en_us":"54","es_es":"54"}, no quotations, no escaping
node.toString(); // -> "{\"en_us\":\"54\",\"es_es\":\"54\"}", add quotations, perserves escaping.
因此,注意 lib 版本并不总是“大师”!
对于带有对象的JsonNode 的toString(),请检查:(Jackson data-bind 2.9)
@Test
public void testToString() {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.createObjectNode();
((ObjectNode) node).put("es_es", "Categor\u00eda ra\u00edz/CATEGORY_OMS_DATA/");
System.out.println((node.toString())); // {"es_es":"Categoría raíz/CATEGORY_OMS_DATA/"}, note: not quotations around!! not like TextNode!
System.out.println(node.asText()); // empty
}