有些场景下,在实现一些基础服务和拦截器的时候,我们可能需要在不知道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字符串节点遍历和修改相关推荐

  1. java字符串转json取集合_Java中Json字符串直接转换为对象的方法(包括多层List集合)...

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...

  2. java list 对象 json字符串_Java中Json字符串直接转换为对象的方法(包括多层List集合)...

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...

  3. 多层json字符串转map_Java中Json字符串直接转换为对象的方法(包括多层List集合)

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...

  4. Jackson将json字符串转换成泛型List/map

    Jackson将json字符串转换成泛型List/map url: http://www.cnblogs.com/quanyongan/archive/2013/04/16/3024993.html ...

  5. android jackson 解析json字符串,一文搞定Jackson解析JSON数据

    Json解析-Jackson使用教程 日常求赞,感谢老板. 一.JSON解析 我这里指的解析是:JSON和JavaObject之间的序列化和反序列化. 如果你的项目进行了前后端分离,那你一定使用过JS ...

  6. java中将json字符串_Java中JSON字符串与java对象的互换实例详解

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...

  7. Java中JSON字符串与java对象的互换实例详解

    这篇文章主要介绍了在java中,JSON字符串与java对象的相互转换实例详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JS ...

  8. Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...

  9. android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...

    1.简单介绍 json是android与server通信过程中经常使用的数据格式,比如.例如以下是一个json格式的字符串: {"address":"Nanjing&qu ...

最新文章

  1. k8s的imagePullSecrets如何生成及使用
  2. 一分钟详解点云配准ICP方法
  3. MySQL中常见的单行函数(下)
  4. IE6-7-8 JS关闭窗口不提示的方法
  5. MyBatis 源码解读-propertiesElement()
  6. Kinect开发笔记之五使用PowerShell控制Kinect
  7. [css] span与span之间有看不见的空白间隔是什么原因引起的?有什么解决办法?
  8. UITableView性能-圆角图片
  9. linux软件安装方法
  10. python flag格式_Python 字符串格式化之 printf-style
  11. oracle clob 导出csv,在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法...
  12. c语言中的正号运算符,C语言 运算符
  13. mui如何对接java后台_MUI框架-09-MUI 与后台数据交互
  14. 树莓派4B安装WPS步骤及缺失字体问题
  15. Elastic控制查询精准度-minimum_should_match
  16. AutoCAD启动缓慢
  17. 利用云服务器自动发送天气预报邮件
  18. 小米校招产品作业解读:设计一款日记APP
  19. 股票价格中后取复权的计算
  20. MySQL里什么是主键_mysql主键是什么?

热门文章

  1. arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
  2. linux删除缓存脚本,Linux 设置定时清除buff/cache的脚本
  3. mysql的left join和inner join的效率对比,以及如何优化
  4. sleep interrupted异常_Java高并发3中断线程以及isInterrupted与interrupted区别
  5. 锚杆拉拔试验弹性模量计算_土钉、锚杆拉拔试验检测方案 - 图文 -
  6. 进阶学习(3.2)Factory Method Pattern 工厂方法模式
  7. 多名分析师上调苹果目标股价,网络推广外包下苹果发展前景仍可观
  8. 网络推广外包——网络推广外包专员升级用户使用体验有方法
  9. 网站与网址现在还有人没搞清二者之间的区别吗?
  10. 联想g510拆键盘的简单方法_如何拆室内门锁?有方法太简单了