最近使用JsonNode解析json字符串时,遇到一个与预期不一致的小问题,记录一下~
先来看一个Test:
/**
* @author xudc
* @date 2019/5/7 16:42
*/
public class JsonNodeTest {
private final static String SUCC = "success";
@Test
public void testJsonNode() throws IOException {
String json = "{\"code\":\"success\",\"data\":{\"message\":\"操作成功\",\"timestamp\":1557214603}}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json);
System.err.println(json);
JsonNode code = jsonNode.get("code");
System.err.println("code.toString():" + code.toString());
System.err.println("code.asText():" + code.asText());
System.err.println("SUCC.equals(code.toString()):" + SUCC.equals(code.toString()));
System.err.println("SUCC.equals(code.asText()):" + SUCC.equals(code.asText()));
}
}
这个程序输出的结果是:
我们发现toString输出的首尾多了一对英文双引号""
。
asText()
是JsonNode
的一个抽象方法public abstract String asText();
,被TextNode
继承并重写了这个方法,直接输出文本内容。
@Override
public String asText() {
return _value;
}
TextNode
重写了Object
的toString()
方法:
@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('"');
}
它是对象的文本表示,因此实际上它会返回给定对象的完整文本形式。根据实现的代码,我们看到会在给定值的首尾追加引用。
这里只是记录一下两者的区别,避免以后混淆~~
原文地址:https://xudc.tech/2019/05/07/record-the-difference-between-astext-and-tostring-in-jsonnode/