jackson中JSON字符串节点遍历和修改 您所在的位置:网站首页 js改变json的值 jackson中JSON字符串节点遍历和修改

jackson中JSON字符串节点遍历和修改

2024-04-23 23:13| 来源: 网络整理| 查看: 265

 有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道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 class PacketHead { private String serviceId; private String rpcMsgId;private Map spiderOpts; //此处getter/setter省去 } public class SpiderRequest { private PacketHead spiderPacketHead; private String requestBody; private String resultInfo; public SpiderPacketHead getSpiderPacketHead() { return spiderPacketHead; } public void setSpiderPacketHead(SpiderPacketHead spiderPacketHead) { this.spiderPacketHead = spiderPacketHead; } public String getRequestBody() { return requestBody; } public void setRequestBody(String requestBody) { this.requestBody = requestBody; } @JsonIgnore public String getRequestId() { return spiderPacketHead.getRpcMsgId(); } public String getResultInfo() { return resultInfo; } public void setResultInfo(String resultInfo) { this.resultInfo = resultInfo; } public static void main(String[] args) throws JsonProcessingException, IOException { SpiderRequest req = new SpiderRequest(); req.setSpiderPacketHead(new SpiderPacketHead()); 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)); }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有