首页 > 其他分享 >fastJson对jsonPath的支持

fastJson对jsonPath的支持

时间:2024-07-25 16:50:30浏览次数:5  
标签:fastJson String System 支持 compile jsonPath JSONPath println out

使用场景

很多时候我们调用上游接口拿到的返回值是json字符串,如果不存在上游共享的公用返回值类,那么下游可能会直接使用JsonObject之类的动态对象类承接这份数据。这时候对于很深的的属性取值是非常复杂的

我们大概会这样写

String getvalue(String jsonStr){
    JSONObject json =JSONObject.parseObject(jsonStr);
    String d = null;
    //比如我们要取出a.b.c.d,但是我们不确定a是不是null,b是不是null,c是不是ull
    JSONObject a = json.getJSONObject("a");
    if( a != null ){
        JSONObject b = json.getJSONObject("b");
        if( b != null ){
            JSONObject c = json.getJSONObject("c");
            if( c != null ){
                d = json.getString("d");
            }
        }
    }
    return d;
}

上面这种写法是非常恶心的,尤其是在层次比较多的时候,如果使用jsonPath一切就变得简单了

String getvalue2(String jsonStr){
    return JSONPath.compile("$.a.d.c.d").eval( jsonStr,String.class );
}

哪些框架支持jsonPath?

fastjson是有jsonPath支持的,redis的json类型,mysql的json类型也都有对jsonPath的支持

hutools 的ison格式化也是对jsonPath有支持的,支持程度不如fastjson

jayway 也是对jsonPath有支持的,但是它默认处理方案是路径不存在报错,不好用

fastJson对jsonPath的支持

可以取值的数据源支持json字符串,JSONObject对象,支持普通java对象

JSONPath jsonpath = new JSONPath("$.name");
JSONPath jsonpath2 = new JSONPath("$.a.b.c[1]");


//可以直接取json字符串的数据
String jsonDate = "{\"a\":{\"b\":{\"c\":[1,2,3]}}}";
System.out.println( jsonpath.eval( jsonDate ) );
System.out.println( jsonpath2.eval( jsonDate ) );

//可以直接取对象的数据
Goods goods = new Goods();
goods.setName("zhangsan");
System.out.println( jsonpath.eval( goods ) );
System.out.println( jsonpath2.eval( goods ) );


//可以直接取jsonObject的数据
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","jsonZhangsan");
System.out.println( jsonpath.eval( jsonObject ) );
System.out.println( jsonpath2.eval( jsonObject ) );


可以指定返回值数据类型

//需要指定类型
System.out.println("指定类型数据存在:" +  jsonpath.<String>eval( jsonObject,String.class ) );
System.out.println("指定类型数据不存在:" +  jsonpath2.<String>eval( jsonObject,String.class ) );

可以静态方法获取数据

它的内部实现是通过多层Segment去一层一层的去取数据

compile是有模版缓存比直接new JsonPath效率高。

read方法底层也用的evel方法

String read = JSONPath.<String>read(JSONObject.toJSONString(goods), jsonpath.getPath(), String.class);
Object eval = JSONPath.eval(goods, jsonpath.getPath());
        
//这是最基本方法,静态方法JSONPath.<String>read(),JSONPath.eval(),都是调用的它
//JSONPath.compile底层自带缓存,缓存了1024个path,比直接调用 new JsonPath的效率高
//推荐使用这个方法
String eval1 = JSONPath.compile(jsonpath.getPath()).<String>eval(goods, String.class);


//对于多层的jsonPath,实际的做法是一层一层取获取
//private JSONPath.Segment[]
//比如a.b.c.d 会被分成 4个Segment

一些常见的方法

取值
//获取属性
String v1 = JSONPath.compile("$.name").<String>eval(jsonObject1, String.class);
System.out.println("eval:" + v1);


//extract比eval用起来复杂,看注释应该比eval出的早
Object v2 = JSONPath.compile("$.name").extract( new DefaultExtJSONParser(jsonObject1.toJSONString()));
System.out.println("extract:" + v2);
删除,修改,取size,得到keys
//删除
System.out.println("删除前:" + jsonObject1 );
JSONPath.compile("$.name").remove(jsonObject1);
System.out.println("删除后:" + jsonObject1 );

//修改值
JSONPath.compile("$.name").set(jsonObject1,"李四");
System.out.println("修改以后:" + jsonObject1 );

//取size
System.out.println("size1:" + JSONPath.compile("$").size(jsonObject1));
System.out.println("size2:" + JSONPath.compile("$").size(goods));
System.out.println("size3:" + JSONPath.compile("$").size(Arrays.asList(1,2,3)));


//得到所有key
System.out.println("keySet-json对象:" + JSONPath.compile("$").keySet(jsonObject1) );
System.out.println("keySet-对象:" + JSONPath.compile("$").keySet(goods) );
判断值和path是否存在
//判断path是否存在
System.out.println("path是否存在:" + JSONPath.compile("$.name").contains(jsonObject1) );


//判断值是否存在
System.out.println("是否存在值"+ JSONPath.compile("$.name").containsValue(jsonObject1,"zhangsan") );
System.out.println("是否存在值"+ JSONPath.compile("$.name").containsValue(jsonObject1,"李四") );
输出path
//输出path
String path = JSONPath.compile("$.name").getPath();
System.out.println("path:" + path);
对数组追加值
//数组,和jsonArray都可以
JSONArray array = new JSONArray();
array.add(1);
array.add(2);
array.add(3);
JSONPath.compile("$").arrayAdd(array,4);
System.out.println("arrayAdd:" + array );

hutool对jsonPath的支持

    /**
     * hutool对jsonnPath的支持
     */
    @Test
    public void hutool_jsonpath(){
        JSONObject obj = JSONUtil.parseObj( Goods.randomGoods() );

        //路径不存在,默认不会报错
        System.out.println( obj.getByPath("$.name.age.name2",String.class) );
        System.out.println( JSONUtil.getByPath(obj,"$.name","") );
    }

jayway对jsonPath的支持

jayway是spring-boot-starter自带的jsonPath工具

image-20240725155522156

使用例子

    /**
     * jayway对jsonnPath的支持
     */
    @Test
    public void jayway_jsonpath(){
        Object read = JsonPath.read(JSONUtil.toJsonStr(Goods.randomGoods()),"$.name");

        //不存在的路径会报错
        //Object read = JsonPath.read(JSONUtil.toJsonStr(Goods.randomGoods()),"$.name.age.name2");
        System.out.println(read);

    }

标签:fastJson,String,System,支持,compile,jsonPath,JSONPath,println,out
From: https://www.cnblogs.com/cxygg/p/18323622

相关文章

  • PixPro 全开源图床系统源码,非常强大的压缩率 自定义尺寸,支持多种格式
    PixPro全开源图床系统源码,非常强大的压缩率自定义尺寸,支持多种格式PixPro全开源图床系统源码,非常强大的压缩率自定义尺寸,支持多种格式一款专为个人需求设计的高效图床解决方案,集成了强大的图片压缩功能与优雅的前台后台管理界面。项目结构精简高效,提供自定义图片压缩率......
  • 一款简而轻的项目运维监控软件,支持低侵入式在线构建、自动部署、日常运维(附源码)
    前言在当今快速发展的软件开发领域,开发团队经常面临一系列运维挑战。没有专业运维人员的支持,开发人员不得不承担构建和部署项目的任务。面对不同项目的构建和部署命令,以及多环境的打包需求,开发人员需要一个能够简化这些流程的解-决方案。同时,监控多个项目的运行状态、远程连......
  • 表情符号错误plotly kaleido静态图片导出不支持表情符号
    https://github.com/misrori/goldhandyoutube/blob/main/aranykez.ipynb在colab中,当您显示时它会起作用。但是当您导出时它不会fromgoldhandimport*tw=Tw()t=GoldHand('TSLA')p=t.plotly_last_year(tw.get_plotly_title('TSLA'))p.upd......
  • OpenAI API 错误:“您尝试访问 openai.ChatCompletion,但 openai>=1.0.0 不再支持此操作
    我目前正在开发一个聊天机器人,由于我使用的是Windows11,它不允许我迁移到较新的OpenAI库或降级它。我可以用其他函数替换ChatCompletion函数以在我的版本上工作吗?这是代码:importopenaiopenai.api_key="private"defchat_gpt(prompt):response=op......
  • [WPF] 脱机环境实现支持拼音模糊搜索的AutoCompleteBox
    AutoCompleteBox是一个常见的提高输入效率的组件,很多WPF的第三方控件库都提供了这个组件,但基本都是字符串的子串匹配,不支持拼音模糊匹配,例如无法通过输入ldh或liudehua匹配到刘德华。要实现拼音模糊搜索功能,通常会采用分词、数据库等技术对待匹配数据集进行预处理。某些场景受制于......
  • 中科蓝讯 蓝牙技术问题协助(非官方技术支持)
    了解到有些开发爱好者面对涉及蓝牙问题无法定位本人愿意在空闲的时间帮助各位蓝牙开发爱好者等,定位中科蓝讯方案的蓝牙相关技术问题。初衷只是互相学习和交流,回复可能较慢!所回复的仅为业余讨论联系方式:邮箱:[email protected]主题注明:芯片名称+蓝牙问题咨询注意:请尽......
  • 抖音私信自动化回复图片-支持个人号和企业号
    亲爱的家人们,你们是否还在为抖音私信回复手忙脚乱而烦恼?今天,我要给大家带来一个超级宝藏——automa自动化插件,让你的回复效率瞬间翻倍,告别手忙脚乱!想象一下,当你的私信小红点不断闪烁,而你却能轻松应对,一键自动化回复,这是多么惬意的事情啊!automa插件,就是实现这一梦想的秘密武器。......
  • GIS场景一键升级视效,支持TMS/WMS/WMTS协议,零代码添加体积云体积雾
    在三维GIS开发中,场景的真实感和高效性始终是用户的核心需求。为此,山海鲸可视化提供了完美的解决方案。这款免费可视化工具不仅支持多种GIS影像协议(TMS、WMS、WMTS等),还可以一键添加体积云和体积雾效果,显著提升画面真实感,并且支持Web端的GIS场景编辑和展示。 山海鲸可视化在多种G......
  • PD协议芯片ECP5701搭配充电管理、升压恒压芯片,支持5V、9V、12V、15V、20V供电,无需过认
    目录文章目录前言一、TYPE-C接口的优势特点二、TYPE-C接口快充市场三、PD协议芯片+充电管理芯片+升压芯片组合(1)案例1:ECP5701+IP2326+FP5207搭配(2)案例2:ECP5701+JW3655E+FP5207B搭配四、ECP5701芯片介绍特点五、PD协议芯片+充电管理芯片+升压芯片组合搭配的作用(1)PD协......
  • 从零开始写 Docker(十九)---增加 cgroup v2 支持
    本文为从零开始写Docker系列第十九篇,添加对cgroupv2的支持。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心原理:Namespace、Cgroups和Rootfs基于namespace的视图隔离:探索......