JsonNode中asText和toString的区别

在处理JsonNode时,发现使用`toString()`输出字段包含额外引号,原因是`toString()`方法由子类(如TextNode)实现,可能添加引号。而`asText()`方法则直接返回字段值,不添加额外字符。使用`asText()`可以避免此问题。
摘要由CSDN通过智能技术生成

在工作中遇到了一个问题,在对比两个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()方法

我们查询源码会发现:

  1. 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
 {
   
   ..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值