简而言之:
详细信息:
我使用我拥有的库进行了测试,然后发现我无法同意被接受的答案。我的版本是2.9。
在我的情况下,toString()
不仅仅是添加引号。它还将保留字符串内容中的转义字符,至少从版本2.0到2.9。
请在此处查看源代码(注意URL中的版本。您可以在页面中选择版本,直到2.10)
2.0:
@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()
可以保留一些转义字符。在这里查看其源代码。(注意,该代码来自2.0分支,而非主分支)
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) {
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 {
sb.append((char) escCode);
}
}
}
但是,现在的
master
分支似乎将此行为简化为“仅添加引号”,就像接受的答案所说的那样。可以在
此页面中看到这一点。实际上,此提交的标题为:
删除对CharTypes.appendQuoted()的依赖;将JsonNode.toString()
的引号更改为单引号,以尝试防止用于JSON生成
但是,我正在使用2.9,CharTypes.appendQuoted()
仍在使用中。因此,通常情况下,如果您没有使用主分支,则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.
因此,库版本不一定总是“主要版本”!
关于带有对象的 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()));
System.out.println(node.asText());
}