最近使用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/