• 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;
        }
        
        @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));
        }
  • 相关阅读:
    Angular 从入坑到挖坑
    如何获取 C# 类中发生数据变化的属性信息
    我的领域驱动设计运用实例
    Newbe.Claptrap
    体验 QQ机器人C# SDK 1.X 特性总结
    Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?
    轻松应对并发问题 Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
    谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
    十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
    docker-mcr 助您全速下载 dotnet 镜像
  • 原文地址:https://www.cnblogs.com/zhjh256/p/6049663.html
Copyright © 2020-2023  润新知