JSONPath浅析

JSONPath浅析 在日常的项目开发中,我们常常会为了避免在代码中hardcoding而对某些参数进行配置化,进而提高开发效率和灵活性。而常用的数据结构就是JSON。而对配置的数据的获取的方式常常有以下几种方式:第一种:JSONPath:@TestpublicvoidtestJsonPath(){JSONObjectdata=JSONObject…

大家好,又见面了,我是你们的朋友全栈君。

 

在日常的项目开发中,我们常常会为了避免在代码中hard coding而对某些参数进行配置化,进而提高开发效率和灵活性。而常用的数据结构就是JSON。

而对配置的数据的获取的方式常常有以下几种方式:

第一种:JSONPath:

    @Test
    public void testJsonPath() {

        JSONObject data = JSONObject.parseObject(
                "{\"other\":[{\"music\":\"海王\",\"movie\":\"神奇女侠\"}],\"address\":\"中国最美丽的地方\",\"gender\":1,\"mobile\":\"9090980\",\"name\":\"张三\",\"age\":23}");

        System.out.println(JSONPath.paths(data));
        Object name = JSONPath.eval(data, "$.name");
        Assert.assertTrue("张三".equals(name));

        List<String> movie = (List<String>) JSONPath.eval(data, "$.other.movie");
        Assert.assertTrue(movie.contains("神奇女侠"));

    }

打印路径结果:

{/name=张三, /other/0={"music":"海王","movie":"神奇女侠"}, /age=23, /other=[{"music":"海王","movie":"神奇女侠"}], /other/0/music=海王, /gender=1, /address=中国最美丽的地方, /mobile=9090980, /={"other":[{"music":"海王","movie":"神奇女侠"}],"address":"中国最美丽的地方","gender":1,"mobile":"9090980","name":"张三","age":23}, /other/0/movie=神奇女侠}

打印的结果中有一个地方非常特殊:

/other/0={“music”:”海王”,”movie”:”神奇女侠”},这个json的配置其实是有些不合理的,但是最后仍然解析出来了。足以见得fastJson非常强大。

第二种:手动处理法

    @Test
    public void testJsonPath() {

        JSONObject data = JSONObject.parseObject(
                "{\"other\":{\"music\":\"海王\",\"movie\":\"神奇女侠\"},\"address\":\"中国最美丽的地方\",\"gender\":1,\"mobile\":\"9090980\",\"name\":\"张三\",\"age\":23}");
        String name = data.getString("name");

        Assert.assertTrue("张三".equals(name));

        String music = Optional.ofNullable(data.getJSONObject("other")).map(e -> e.getString("music")).orElse(null);

        Assert.assertTrue("海王".equals(music));

    }
  • 总结:

通过简单的例子,我们可以发现通过JSONPath可以非常便捷的从JSON中获取我们想要的字段的值。远比在代码中hard coding来的优雅和灵活的多。同时,通过配置我们的获取路径也可以非常方便的做个一个可配置的选项。

 

  •  应用场景

1、在平时的配置化开发中可以将我们系统的一些业务配置等信息以JSON的形式存放在数据库中,在需要的时候按需解析即可。可以大幅度的减少在项目中的硬编码。

2、在一些规则场景如风控、规则引擎、或者配置的系统中可以使用到。直接中JSON中获取变量,进行规则运算。当 事件满足某些场景是触发相应的动作。

  • 写在最后

对JSONPath做了支持的库:

1、fastJson

2、JsonPath

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149070.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午3:36
下一篇 2022年6月16日 下午3:36


相关推荐

  • C语言程序设计入门教程

    C语言程序设计入门教程C 语言程序设计入门教程目录语言分类 C 语言特点最简单的 C 语言程序注释方式 C 语言程序的结构程序设计的任务阶段选择结构程序设计创建一个表格设定内容居中 居左 居右 SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的 KaTeX 数学公式新的甘特图功能 丰富你的文章 UML 图表 FLowchart 流程图导出与导入导出导入目录语言分类机器语言 二进制工作原理 符号语言 汇编语言 高级语言非结构化语言 结构化语言 面向对象语言 C 语言特点用途广泛 功能强大 运算符丰富 数据

    2026年3月26日
    2
  • 图的四种最短路径算法

    图的四种最短路径算法本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径。下面是核心代码:[cpp] viewplain copyvoid dfs(int cur, int dst){ …

    2022年6月4日
    40
  • 无题

    无题

    2021年3月12日
    183
  • .pkl文件读取_pkl是什么文件格式

    .pkl文件读取_pkl是什么文件格式1.根据网上查阅的读取方法importpicklefile=open(“./dataset-cornell-length10-filter1-vocabSize40000.pkl”,”rb”)data=pickle.load(file)print(data)file.close()在这里,注意在读取的使用的是”rb”,也就是二进制文件格式,而”r”是普通格式的读取用print输…

    2025年10月17日
    8
  • _ctl0_ContentPlaceHolder1 或者 ctl00_ContentPlaceHolder1

    _ctl0_ContentPlaceHolder1 或者 ctl00_ContentPlaceHolder1当你使用masterpage的时候,页面内的服务端控件会自动加上 _ctl0_ContentPlaceHolder1或者ctl00_ContentPlaceHolder1,但什么时候是出现_ctl0_ContentPlaceHolder1,而又什么时候出现的是ctl00_ContentPlaceHolder1呢? 修改web.configxhtmlConformance mode=

    2022年7月13日
    15
  • IntelliJ idea 必备 好用 优秀 插件

    IntelliJ idea 必备 好用 优秀 插件1、AtomMaterialICons这是一个icon图片插件,有一个特别牛的功能就是可以优化idea流畅度,不知道是什么原理,现在这个插件成为了我必备插件2、FileExpander有了这个插件,有些小伙伴平时用的Jad工具就可以扔了,它能在Idea里直接打开Jar包3、GitToolBox这款插件现在我几乎离不开它。他能在项目上提示你还有多少文件没提交,远程还有多少文件没更新下来。还能在每一行代码上提示上次提交的时间。查版本提交问题的时候尤其方便4、MavenHelper

    2022年10月9日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号