在工作中遇到了一个问题,在对比两个JSON的时候,使用到了JsonNode。但是在内容输出的时候遇到了问题。
问题
原始的json举例如下:
{
"strKey":"value",
"intKey":1
}
当我们使用JsonNode输出strKey的时候,结果竟然不是**“value"而是”“value”"**
String jsonStr = "{\"strKey\":\"value\",\"intKey\":1}";
ObjectMapper mapper = new ObjectMapper();
JsonNode source = mapper.readTree(jsonStr);
source.get("strKey").toString();
原因
toString()方法的原因
// JsonNode是一个抽象类
public abstract class JsonNode
extends JsonSerializable.Base // i.e. implements JsonSerializable
implements TreeNode, Iterable<JsonNode>
{
...
@Override
public abstract String toString();
}
如上代码所见,JsonNode是一个抽象类,其中的toString()方法 是交给他的子类去实现的。那么我们在进行toString的时候,去调用了什么子类去实现呢? 去使用了JsonNode的TextNode子类,用了它的toString()方法
我们查询源码会发现:
- mapper.readTree() 的源码 主要如下
public JsonNode readTree(String content)
throws IOException, JsonProcessingException
{
JsonNode n = (JsonNode) _readMapAndClose(_jsonFactory.createParser(content), JSON_NODE_TYPE);
return (n == null) ? NullNode.instance : n;
}
其中关键是执行了_readMapAndClose方法,这个方法中关键源码如下:
protected Object _readMapAndClose(JsonParser p0, JavaType valueType)
throws IOException
{
..