jackson中JSON字符串节点遍历和修改
2023-09-27 14:28:34 时间
有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道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<String,String> 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)); }
相关文章
- 图神经网络(GNN):综述【从图(Graph)到图卷积(Graph Convolution)】【各种图神经网络模型的目的就是学习到图中各个节点的Embedding表示】
- GNN-静态表征-随机游走-2017:Metapath2vec【 步骤:①基于预定义“元路径”的有偏随机游走生成每个节点的训练序列,得到训练数据集;②套用Word2vec算法得到节点表示】【异质图】
- 最短路径算法:迪杰克斯拉(Dijkstra)算法(基于贪心思想)【从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题】【能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低】
- 图算法(四):K跳算法(k-hop)【适用场景:用于关系发现、影响力预测、好友推荐等场景】【从起点出发,通过宽度优先搜索(BFS),找出k层与之关联的所有节点。找到的子图称为起点的“ego-net”】
- 大数据-Zookeeper(一):基于观察者模式设计的分布式服务管理框架【以树状节点存储、管理大家都关心的数据,接受各观察者的注册,一旦这些数据状态变化,ZK就通知各观察者】【与Hadoop独立】
- 基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)
- 【状态估计】基于二进制粒子群优化 (BPSO) 求解最佳 PMU优化配置研究【IEEE30、39、57、118节点】(Matlab代码实现)
- 修改副本集端口(带仲裁节点)
- 【转】C# 中Linq查询所有上级节点或所有下级节点
- fabric基础设施管理-(三)单机-动态新增组织节点
- ElasticSearch集群以及集群中节点的类型和主节点的脑裂问题
- Neo4j删除节点和关系、彻底删除节点标签名
- 树形组件自定义节点内容
- 创建B树,动态添加节点,并使用三种遍历算法对树进行遍历
- 1791. 找出星型图的中心节点
- 拿捏 javascript 中的节点操作
- html5中JavaScript删除全部节点
- 判断两链表的相交节点
- Devstack 多节点自动化部署
- Zookeeper客户端API之创建节点(七)
- Kafka快速入门(Kafka Broker)节点服役和退役、手动调整副本