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 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;}@JsonIgnorepublic 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));}
转载于:https://www.cnblogs.com/zhjh256/p/6049663.html
jackson中JSON字符串节点遍历和修改相关推荐
- java字符串转json取集合_Java中Json字符串直接转换为对象的方法(包括多层List集合)...
使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...
- java list 对象 json字符串_Java中Json字符串直接转换为对象的方法(包括多层List集合)...
使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...
- 多层json字符串转map_Java中Json字符串直接转换为对象的方法(包括多层List集合)
使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...
- Jackson将json字符串转换成泛型List/map
Jackson将json字符串转换成泛型List/map url: http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html ...
- android jackson 解析json字符串,一文搞定Jackson解析JSON数据
Json解析-Jackson使用教程 日常求赞,感谢老板. 一.JSON解析 我这里指的解析是:JSON和JavaObject之间的序列化和反序列化. 如果你的项目进行了前后端分离,那你一定使用过JS ...
- java中将json字符串_Java中JSON字符串与java对象的互换实例详解
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...
- Java中JSON字符串与java对象的互换实例详解
这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...
- Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...
- android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...
1.简单介绍 json是android与server通信过程中经常使用的数据格式,比如.例如以下是一个json格式的字符串: {"address":"Nanjing&qu ...
最新文章
- k8s的imagePullSecrets如何生成及使用
- 一分钟详解点云配准ICP方法
- MySQL中常见的单行函数(下)
- IE6-7-8 JS关闭窗口不提示的方法
- MyBatis 源码解读-propertiesElement()
- Kinect开发笔记之五使用PowerShell控制Kinect
- [css] span与span之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
- UITableView性能-圆角图片
- linux软件安装方法
- python flag格式_Python 字符串格式化之 printf-style
- oracle clob 导出csv,在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法...
- c语言中的正号运算符,C语言 运算符
- mui如何对接java后台_MUI框架-09-MUI 与后台数据交互
- 树莓派4B安装WPS步骤及缺失字体问题
- Elastic控制查询精准度-minimum_should_match
- AutoCAD启动缓慢
- 利用云服务器自动发送天气预报邮件
- 小米校招产品作业解读:设计一款日记APP
- 股票价格中后取复权的计算
- MySQL里什么是主键_mysql主键是什么?
热门文章
- arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
- linux删除缓存脚本,Linux 设置定时清除buff/cache的脚本
- mysql的left join和inner join的效率对比,以及如何优化
- sleep interrupted异常_Java高并发3中断线程以及isInterrupted与interrupted区别
- 锚杆拉拔试验弹性模量计算_土钉、锚杆拉拔试验检测方案 - 图文 -
- 进阶学习(3.2)Factory Method Pattern 工厂方法模式
- 多名分析师上调苹果目标股价,网络推广外包下苹果发展前景仍可观
- 网络推广外包——网络推广外包专员升级用户使用体验有方法
- 网站与网址现在还有人没搞清二者之间的区别吗?
- 联想g510拆键盘的简单方法_如何拆室内门锁?有方法太简单了