【5】Vite+Vue3 JsonPath的使用

news2024/11/27 2:49:14

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。Vite+Vue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。

作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突出的优势。而Vue3,则以更加简化的API和更高效的响应式系统为开发者带来了更加流畅的开发体验。结合使用Vite和Vue3,你将能够快速搭建稳定、高效的前端项目。

在这个专栏里,我们将通过100+个实战示例,详细介绍Vite+Vue3的各个方面。从项目的创建和配置开始,我们会一步一步地引导你使用Vite搭建项目的基本框架,并深入讲解Vue3的语法和特性。随后,我们将演示如何构建常见的前端组件、路由管理和状态管理,以及与后端API的交互等实际项目开发中常见的场景。

无论你是从零开始学习Vite+Vue3,还是希望进一步提升你的前端开发能力,本专栏都能为你提供实用的知识和实战经验。通过这100+个实战示例的学习,你将能够掌握Vite+Vue3的核心概念和技术,并能够在实际项目中灵活应用。

赶快加入我们吧,开始你的Vite+Vue3项目实战之旅!

一、JsonPath是什么 ❔ ❔ ❔

JsonPath是一种用于查询和过滤JSON数据的语言。它类似于XPath,但专为处理JSON数据而设计。使用JsonPath,您可以根据预定义的语法模式从JSON数据中选择和提取特定的值或对象。它可以用于查找、过滤和提取JSON数据的任何部分,如属性、数组、嵌套对象等。通过指定路径表达式,您可以快速、简洁地定位JSON数据中的目标元素。

二、使用JsonPath的好处 ❔ ❔ ❔

1、简洁 🔥 🔥

使用JsonPath,您可以用短小的路径表达式准确地选择和提取JSON数据,而不需要编写复杂的循环和条件语句。

2、灵活 🔥 🔥

JsonPath支持多种操作符和筛选条件,使您能够灵活地过滤和操作JSON数据。

3、兼容性 🔥 🔥

JsonPath在许多编程语言和工具中都有实现,如JavaScript、Java、Python等,因此可以在不同环境中广泛使用。

总之,JsonPath是一种强大的工具,可以帮助前端开发人员更高效地处理和操作JSON数据。

三、演示数据 ✨ ✨ ✨

演示数据的话来自于JsonPath官网。对官网的使用案例再一次进行补充。

const source  = ref({
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        },
        "classify": {
            "Meat": ['鸡肉', '牛肉'],
            "fruit": ['苹果', '牛油果'],
        },
    }
})

使用方法 ✨ ✨ ✨

JSONPath({
    path: `$.store.*`,
    json: source.value,
    resultType: 'value',
})

参数说明 ✨ ✨ ✨

json的话就是数据源

path

path是用来指定要提取的JSON数据的位置。它由层级结构的键和运算符组成,用于导航和过滤JSON数据。

$根节点
$.key选择根节点下名为"key"的键
$.key1.key2选择根节点下名为"key1"的键的值中的名为"key2"的键
$.array[0]选择根节点下名为"array"的键的值中的索引为0的元素
$.array[*]选择根节点下名为"array"的键的值中的所有元素
$.array[?(@.key == "value")]选择根节点下名为"array"的键的值中,具有键"key"的值等于"value"的元素

resultType

value返回匹配结果的值。
path返回匹配结果的路径。
all返回匹配结果的值和路径。
pointer返回匹配结果的JSON指针。
parent返回匹配结果的父节点。
parentProperty返回匹配结果的父节点的属性名。

1、获取store下的所有数据 👇 👇

JSONPath({
    path: `$.store.*`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [Proxy(Array), Proxy(Object), Proxy(Object)]

2、获取book下的所有数据 👇 👇

JSONPath({
    path: `$.store.book.*`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [Proxy(Object), Proxy(Object), Proxy(Object), Proxy(Object)]
JSONPath({
    path: `$...book.*`, // `$...book[*]`
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [Proxy(Object), Proxy(Object), Proxy(Object), Proxy(Object)]

3、获取book数组中的数据 👇 👇

3.1、获取book中的指定元素

// book[*]代表 book下的所有元素
JSONPath({
    path: `$.store.book[*].author`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
// book[0]代表 book下的第一个元素
JSONPath({
    path: `$.store.book[0].author`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => ['Nigel Rees']

3.2、获取book最后一个元素

JSONPath({
    path: `$.store.book[(@.length-1)]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]
JSONPath({
    path: `$.store.book[-1:]]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]

3.3、获取起始下标到结束下标之间的数据

JSONPath({
    path: `$.store.book[0,1]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
JSONPath({
    path: `$.store.book[:2]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]

3.4、获取book第一个元素中的指定属性对应的值

// 获取book第一个元素中的指定属性对应的值
JSONPath({
    path: `$.store.book[0][category,author]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => ["reference","Nigel Rees"]

3.5、获取book中含有指定属性(指定属性值不为空)的元素

JSONPath({
    path: `$.store.book[?(@.isbn)]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]

3.6、获取book中price属性值小于10的

JSONPath({
    path: `$.store.book[?(@.price<10)]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]

4、正则匹配book下key值是bn结尾的元素 👇 👇

JSONPath({
    path: `$..book.*[?(@property.match(/bn$/i))]^`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})

5、正则获取store下key包含class的元素 👇 👇

JSONPath({
    path: `$.store[?(@property.match(/class/i))]`,
    json: source.value,
    resultType: 'value', // value、path、all、pointer、parent、parentProperty
})
// => [{"Meat":["鸡肉","牛肉"],"fruit":["苹果","牛油果"]}]

四、公共方法的封装 ✨ ✨ ✨ 

经过上面的使用方法以后,每次都要写这么,比较麻烦,在观察使用的规则以后,我封装了一个基本能符合大部分使用规则的公共方法。

const universalMatcher = (field: NamePath | NamePath[]) => {
    const fieldType = getType(field)
    if (fieldType === "string" || fieldType === 'number') {
        return field
    }
    // 这里按道理来说field本身就是(string | number)[],但是我的编辑器好像有点蠢,我只能再通过as断言一下
    let result: string = '';
    (field as (string | number)[]).forEach(item => {
        const itemType = getType(item)
        if (itemType === "string") {
            result += `${item}.`
        } else if (itemType === "number") {
            if (!result) {
                throw {
                    code: -1,
                    msg: 'The input parameters do not match'
                }
            }
            result = removeLastPoint(result) + `[${item}].`
        }
    })
    return removeLastPoint(result)
}

const getJsonPathData = (field: NamePath | NamePath[], type: 'value'|'path'|'all'|'pointer'|'parent'|'parentProperty' = 'value') => {
    return JSONPath({
        path: `$.${universalMatcher(field)}`,
        json: source.value,
        resultType: type,
    })
}

使用 ✨ ✨ ✨ 

onMounted(() => {
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store', 'book[(@.length-1)]'])))
    // => [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]
    
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store[?(@property.match(/class/i))]'])))
    // => [{"Meat":["鸡肉","牛肉"],"fruit":["苹果","牛油果"]}]
    
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store', 'book', 0, 'author'])))
    // => ["Nigel Rees"]
    
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store', 'book[0]', 'author'])))
    // => ["Nigel Rees"]
    
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store', 'book[0]', 'author'], "all")))
    // => [{"path":"$['store']['book'][0]['author']","value":"Nigel Rees","parent":{"category":"reference","author":"Nigel Rees","title":"Sayings of the Centu
    
    console.log('👉👉👉-----------------', JSON.stringify(getJsonPathData(['store', 'book[0]', 'author'], "path")))
    // => ["$['store']['book'][0]['author']"]
})

我是Etc.End。每一次进步都值得庆祝,每一次努力都值得赞赏。不要忽视自己的成长,每一步都是向前迈进的力量。如果我的文章对你有所帮助的话,希望能留下你的点赞和收藏。😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP证书怎么考?来自前辈的经验之谈

虽然我成功通过了 PMP 考试&#xff0c;这是我第一季度所做的事情的成果&#xff0c;但是考试的兴奋感很快就过去了。在交流群里&#xff0c;大家都在讨论证书的存续条件以及获得证书后带来的实质性收益&#xff0c;例如补贴、城市定居加分和职业晋升等。与这些相比&#xff0c…

Android ViewGroup onDraw为什么没调用

ViewGroup&#xff0c;它本身并没有任何可画的东西&#xff0c;它是一个透明的控件&#xff0c;因些并不会触发onDraw&#xff0c;但是你现在给LinearLayout设置一个背景色&#xff0c;其实这个背景色不管你设置成什么颜色&#xff0c;系统会认为&#xff0c;这个LinearLayout上…

【Redis】底层探析 I - Redis 有序集合(ZSet)是如何实现的?

目录 ZSet的编码方式 什么是跳跃列表(skiplist)&#xff1f; ZSet的底层结构 跳跃列表的查询过程 ZSet的编码方式 Redis中的有序集合zset底层实现采用了两种编码方式&#xff1a; REDIS_ENCODING_SKIPLIST 跳跃列表REDIS_ENCODING_ZIPLIST 压缩列表 对于不同编码的触发方式…

Kotlin获取Fragment中的组件

左边和右边分别是两个不同的Fragment&#xff0c;左边的Fragment中右一个Button组件&#xff0c;目标是想要获取这个组件的id&#xff0c;以便进行将右边的Fragment更改成另一个Fragmeent的操作。 left_fragment.xml <?xml version"1.0" encoding"utf-8&qu…

raid5故障导致上层文件系统不可用的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器上有两组分别由4块SAS硬盘组建的raid5磁盘阵列&#xff0c;这两组raid5阵列划分LUN并组成LVM结构&#xff0c;格式化为EXT3文件系统。 服务器故障&#xff1a; 一组raid5阵列上的一块硬盘未知原因离线&#xff0c;热备盘上线替换离线…

浅谈医用IT隔离电源系统在医疗场所的应用及设计

安科瑞 华楠 摘 要:结合某工程设计实例对IT系统特点、构成及医疗IT系统相关规范要求进行了详细阐述&#xff0c;并提供了医疗IT系统的工程设计经验&#xff0c;旨在推动医疗IT系统的发展。 关键词:医疗IT系统&#xff0c;隔离变压器&#xff0c;绝缘监测&#xff0c;电击 随…

餐饮行业油烟监控管理系统设计与应用

安科瑞 华楠 摘 要&#xff1a;餐饮油烟污染问题已经成为城市环境污染的重要污染源&#xff0c;本研究的油烟在线监测数据管理信息系统是油烟在线监测数据采集仪的配套软件&#xff0c;用于展现现场端数据采集仪采集的数据&#xff0c;对数据采集仪进行远程控制&#xff0c;以…

Docker安装Nacos2.0.2

docker拉取镜像 docker pull nacos/nacos-server:2.0.2查看镜像 docker images创建容器和运行 docker run -e JAVA_OPTS"-Xms256m -Xmx256m" -e MODEstandalone -e PREFER_HOST_MODEhostname -p 8848:8848 --privilegedtrue --restartalways --name nacos -d naco…

Redis简介(1)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis简介1、NoSQL1.1、什么是NoSQL&#xff1f;1.2、NoSQL 特点…

MySQL事务与事务的隔离级别

MySQL事务与事务的隔离级别 什么事务&#xff1f;事务的特点&#xff08;ACID&#xff09;事务的隔离级别多事务运行的并发问题隔离级别repeatable read&#xff08;可重复读&#xff09;之 MVCC&#xff08;多版本并发控制&#xff09; 并发机制优化 什么事务&#xff1f; 事务…

这些项目管理实际问题,你遇到过几个

大家好&#xff0c;我是老原。 我做了这么久的内容&#xff0c;给大家分享了很多干货、工具还有行业的内容。 今天的文章汇总了粉丝们来私信我的一些实际工作问题&#xff0c;不知道这些问题你熟不熟悉&#xff0c;是否也遇到过&#xff1f; 当然&#xff0c;这不仅是纯粹为…

postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 表锁介绍 当表打开&#xff0c;或者操作表时&#xff0c;都需要…

spring复习:(44)使用TransactionProxyFactoryBean来实现事务时,事务是怎么提交的?

TransactionAspectSupport类的invokeWithinTransaction方法的最后&#xff1a; 调用commitTransactionAfterReturning,它的代码如下&#xff1a; 调用的commit代码如下&#xff08;AbstractPlatformTransactionManager类里&#xff09;&#xff1a; 其中调用的processCommit…

Altium Designer V23介绍、下载、安装、注册(激活)与汉化

一、Altium Designer简介 Altium Designer 是一款简单易用、原生3D设计增强的一体化设计环境&#xff0c;结合了原理图、ECAD库、规则和限制条件、BoM、供应链管理、ECO流程和世界一流的PCB设计工具。通过原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析…

代理IP、Socks5代理与网络安全:保护隐私与防御威胁的技术探索

目录 一、代理IP技术 二、代理IP保护隐私和网络安全 三、Socks5代理与网络安全 总结 一、代理IP技术 代理IP、Socks5代理IP是与网络安全相关的技术&#xff0c;可以用于保护隐私和防御威胁。下面是对这些技术的探索和解释&#xff1a; 1. 代理IP&#xff1a;代理IP是指通过…

什么是并发(非常详细)

按最简单、最基本的程度理解&#xff0c;并发&#xff08;concurrency&#xff09;是两个或多个同时独立进行的活动。并发现象遍布日常生活&#xff0c;我们可以边走路边说话&#xff0c;左右手同时做出不一样的动作&#xff0c;诸如此类。 计算机系统中的并发 若我们谈及计算…

图书馆管理的好帮手:Librarian Pro Mac 让你的阅读体验更加完美

Librarian Pro Mac是一款功能齐全、易于使用的图书馆管理软件&#xff0c;适用于个人用户、图书馆、学校和其他组织。它提供了丰富的功能和灵活的组织方式&#xff0c;帮助用户轻松管理和浏览他们的图书馆和收藏品。无论你是一个热衷于阅读的个人&#xff0c;还是一个需要管理大…

Linux小程序——进度条【Linux系统编程】

回车换行&#xff1a;回车&#xff08;\r&#xff09;是回到当前光标所在行的最开始&#xff0c;换行(\n)是换到下一行&#xff0c;回车换行就是到下一行的最开始。 缓冲区&#xff1a; 先看第一种&#xff1a;helloworld后面有反斜杠n&#xff0c;那么我们看到的现象是先打印…

01-复杂度2 Maximum Subsequence Sum

思路 比上一题&#xff08;01-复杂度1 最大子列和问题&#xff09;&#xff0c;要多记录几个内容 首尾元素&#xff0c;当前子序列开头元素&#xff0c;当前子序列结尾元素&#xff0c;最佳子序列开头元素&#xff0c;current是否在此处清零&#xff08;则下一个元素是开头元…

2023年四川大学生程序设计竞赛-A.旷野之息

题目描述 Cuber QQ 终于打败盖农救回了塞尔达公主&#xff0c;海拉鲁大地也开始灾后重建。 在统计学中&#xff0c;幂律表示的是两个量之间的函数关系&#xff0c;其中一个量的相对变化会导致另一个量的相应幂次比例的变化&#xff0c;且与初值无关&#xff1a;表现为一个量是…