jackson改变json值_jackson中JSON字符串节点遍历和修改

有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道JSON字符串所属对象类型的情况下,对JSON字符串中的某些属性进行遍历和修改,比如,设置或查询一些报文头字段。

在jackson中,使用最多的JsonNode抽象类并没有提供修改节点值的方法,而是在ObjectNode节点中提供修改接口,这个节点在官方的说明中,一般用于创建新的节点。

假设packet.getDecryptRequestBody()中是一个json字符串,可以通过如下代码查看

JsonNode rootNode =mapper.readTree(packet.getDecryptRequestBody());

JsonNode targetNode= null;

targetNode= rootNode.findValue("rpcMsgId"); //查找第一级的rpcMsgId属性,如果属性不存在,则返回null,属性值如果为明确的null,返回NullNode,否则返回正常的JsonNode//注:JsonNode还提供了find/path/get等获取节点的方法,但是这三种方法都不能明确的区分节点不存在、为明确的null。所以,应该使用findValue方法。

如果只是纯粹的遍历和类似JsonTree的构造,网上各种文章一堆,主要是对原json中属性的修改。可通过如下方式进行修改:

((ObjectNode)targetNode).put("rpcMsgId","abcdefg1234567890"); // 通过强制转换为ObjectNode,就可以对当前节点进行修改,其他的XXXNode均没有提供相关的API接口

String modifiedJsonStr = mapper.writeValueAsString(rootNode); // 最后重新生成json字符串,这跟dom4j修改xml一样,只能重新生成,内置不支持直接修改原文件

完整的例子如下:

public classPacketHead {privateString serviceId;privateString rpcMsgId;private MapspiderOpts;//此处getter/setter省去

}public classSpiderRequest {privatePacketHead spiderPacketHead;privateString requestBody;privateString resultInfo;publicSpiderPacketHead getSpiderPacketHead() {returnspiderPacketHead;

}public voidsetSpiderPacketHead(SpiderPacketHead spiderPacketHead) {this.spiderPacketHead =spiderPacketHead;

}publicString getRequestBody() {returnrequestBody;

}public voidsetRequestBody(String requestBody) {this.requestBody =requestBody;

}

@JsonIgnorepublicString getRequestId() {returnspiderPacketHead.getRpcMsgId();

}publicString getResultInfo() {returnresultInfo;

}public voidsetResultInfo(String resultInfo) {this.resultInfo =resultInfo;

}public static void main(String[] args) throwsJsonProcessingException, IOException {

SpiderRequest req= newSpiderRequest();

req.setSpiderPacketHead(newSpiderPacketHead());

String json=JsonUtils.toJson(req);

System.out.println(json);

JsonNode node=mapper.readTree(json);

JsonNode node1= node.findValue("spiderPacketHead");

ObjectNode node2=(ObjectNode) node1;

node2.put("rpcMsgId", "abc");

System.out.println(mapper.writeValueAsString(node));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值