# 前端 json 对象数据处理方法汇总 *数据分析案例* 在这篇文章中,讲解了如何在 JavaScript 中操作 JSON 数据,包括构建,添加、修改、删除和查找等操作。 ## 目录 [TOC] ## 什么是 json?  JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式,它可以在各种编程语言中互相转换,同时其具有非常灵活的处理方式,能够像一个对象的包装类一样,也称之为是键值对结构,属性的名字通常是键,数值通常为值,如下面所示封装了很多的字段。 ```json { "id":1, "name":"zhao", "sex":"男", "age":20 } ``` json 甚至还可以包含嵌套的对象,就像下面一样,第一个用户的 ‘assistant’ 字段又嵌套着一个 json 对象。 ```json { "id":1, "name":"zhao", "sex":"男", "age":20, "assistant":{ "id":2, "name":"yang", "sex":"女", "age":22, "assistant":{} } } ``` json 中也可以包含一个列表,只需要使用中括号来实现就可以,下面就是一个例子,在兴趣字段(interest)中对应的就是一个列表,里面存储了4个元素。 ```json { "id":1, "name":"zhao", "sex":"男", "age":20, "interest":["吃", "喝", "玩", "乐"] } ``` 那么我们现在该思考一下,列表里面的数值类型可以变吗?当然是可以的,列表里面可以是任意类型,下面就是一个例子。 ```json { "id":1, "name":"zhao", "sex":"男", "age":20, "interest":[1, 2, 3, 4] } ``` 有趣的地方又来了,能够体现出 json 灵活性的地方就是,列表里面的元素还可以是一个json对象 下面就是一个例子,assistant 字段对应的是一个列表,列表中的每一个元素是一个 json 对象。 ```json { "id":1, "name":"zhao", "sex":"男", "age":20, "assistant":[ { "id":2, "name":"yang", "sex":"女", "age":22, "assistant":{} }, { "id":3, "name":"huai", "sex":"男", "age":20, "assistant":{} } ] } ``` 到这里我们已经见识到了 json 的各种格式,相信你也可以明白什么是 json 了。 ## 如何使用 json 截止到目前,只是看过 json 数据的格式,以及体会了一下它的灵活性,但是并没有真正的上手使用过 json 数据,所以接下来我们就来进行 json 相关的知识培训! ### JS 中的 JSON 与 String 相互转换 我们知道在 JS 中 String 对象是一个常见的数据类型,而在很多情况下 json 数据也是字符串的形式,并不能够被直接使用,就像下面的JS代码一样,在这里我们就来展示如何将字符串转换为 json。 ```JavaScript // 这里的 json 是一个字符串 并不是一个 json 对象 let json = "{\"name\":\"zhao\"}" // 所以在这里获取到 json 中的 name 属性的时候 会打印出 undefined !因为这个根本就不是 JSON 没有 name 属性 // 这里的语法还没有学,不过不用担心,后面会讲到 console.info(json.name) ``` #### String -> json (JSON.parse) JSON.parse 函数专用于将一个字符串解析为 json 对象,下面就是相关的示例 ``` // 这里的 json 是一个字符串 并不是一个 json 对象 let json = "{\"name\":\"zhao\"}" // 将 字符串 转换为 json 对象 json = JSON.parse(json) // 在这里就可以打印出 zhao 了 console.info(json.name) ``` #### json -> String (JSON.stringify) 同样,既然一个 字符串可以被解析为 json 对象,那么一个 json 对象也可以被转换为一个字符串,下面就是一个示例 ``` // 在这里准备一个 json 对象 let json = {"name":"zhao"} // 将 JSON 对象转换为 字符串 json = JSON.stringify(json) // 在这里就发现它变成字符串了 不可以打印出 其中的name属性了 console.info(json.name) ``` ### 对 json 对象增加属性 截止到目前,我们已经实现了 json 对象的创建,也了解了什么是 json,但是json在创建之后可以修改吗?是可以的!接下来将开始演示 如何为 json 对象增加一个新的属性。 ```JavaScript // 在这里准备一个 json 对象 let json = {"name":"zhao"} // 为 json 对象新增一个属性属性 age 其实之际赋值就可以了 json['age'] = 20 // 在这里我们打印出 json 对象 console.info(json) ``` 运行之后的结果如下所示 ```JavaScript { "name": "zhao", "age": 20 } ``` ### 删除 json 对象中的某个属性 在 js 中有一个 delete 关键字,通过对于此关键字的使用,可以实现将参数删除的效果,可以将它理解为C语言中的指针释放操作,使用语法为`delete <需要被删除的关键字>` 接下来就是一个具体的演示示例。 ```javaScript // 在这里准备一个 json 对象 let json = {"name":"zhao"} // 为 json 对象新增一个属性属性 age 其实之际赋值就可以了 json['age'] = 18 // 删除掉 json 中的 name 参数 delete json['name'] // 在这里我们打印出 json 对象 console.info(json) ``` 下面是运行结果,可以看到最终被删除的 name 参数消失了。 ``` { "age": 18 } ``` ### 修改 json 对象中的某个属性 我们知道可以通过 `json对象名['属性名']`的方式来将 json 中的某个属性获取到,通过 `delete` 关键字的操作,相信各位也有了些猜测,`json对象名['属性名']`的方式获取到的不仅仅是一个值,可以将它理解为是一个内存地址,是属性对应的内存地址,因此删除和修改操作都是基于此进行的,根据这里的猜测,不难得出一个结论,修改 json 中的某个属性其实就是针对属性进行再一次赋值,下面就是示例。 ```javaScript // 在这里准备一个 json 对象 let json = {"name":"zhao"} // 对于 json 中的 name 进行重新赋值 json['name'] = 'yang' // 打印 json 对象 console.info(json) ``` 而执行过程其实就如下所示,非常易于理解 ```flow pn=>start: ”json = {"name":"zhao"}“ op0=>operation: 打印:console.info(json) op1=>operation: 打印:console.info(json) op2=>operation: 修改:json['name'] = 'yang' res1=>subroutine: ”json = {"name":"zhao"}“ res2=>subroutine: ”json = {"name":"yang"}“ cond=>condition: 是否要进行修改 pn->cond->e cond(no)->res1 cond(yes)->op2->res2 ``` 下面是运行结果,name属性对应的数值已经成功的变为了 yang ``` { "name": "yang" } ``` ### 迭代 json 对象 json 对象是一个可以迭代的对象,而此操作的本质其实就是取出所有的属性的名字,接下来将展示如何迭代一个 json。 ```javaScript // 在这里准备一个 json 对象 let json = { "name1":"zhao", "name2":"zhao", "name3":"zhao", "name4":"zhao", "name5":"zhao", } // 开始迭代 json for (let jsonKey in json) { // 在迭代的时候 jsonKey 就是 json 中对应的所有的 key console.info(jsonKey, jsonKey + '对应的值 = ' + json[jsonKey]) } ``` 下面是运行结果 ``` name1 name1对应的值 = zhao name2 name2对应的值 = zhao name3 name3对应的值 = zhao name4 name4对应的值 = zhao name5 name5对应的值 = zhao ``` ## JSON 实战案例 ### 题目 了解了如何进行 json 的基本使用 接下来进行一个案例的作答,接下来我们将提供一份数据,数据中的 ‘trends_all’ 包含很多的文章json对象,要求计算出 数据分析案例 专题 一共有多少个文章,数据分析案例的id为‘88842223’; ### 数据准备 ```JavaScript const dataset = { "trends_all": [ { "id": -46799614, "title": "原神怎么达成《罗基艾威尔森及利亚姆》成就", "sendDate": 1701319574000, "sendId": 4, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/zhao4/trends/-46799614/trends_text.txt", "imagesSrc": [ "https://media.9game.cn/gamebase/ieu-gdc-pre-process/images/20231112/13/29/b9d4742f27682cc4496462aaf5af11d8.jpg" ], "description": "发现了一拳超人,形似平民,恐怖至极,击败它即可!", "ip": "中国 天津", "count": 32, "articleTopic": -44879746, "status": "已发布" }, { "id": -15471917, "title": "Axios与ECharts进行数据可视化案例", "sendDate": 1701318683000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/-15471917/trends_text.txt", "imagesSrc": [ "https://echarts.apache.org/zh/images/logo.png?_v_=20200710_1" ], "description": "文章《 Axios 与 ECharts 进行 数据可视化 案例》主要介绍如何使用 Axios 和 ECharts 两个开源工具进行 数据可视化。演示了如何使用 Axios 处理数据,并使用 ECharts 创建图表来进行数据可视化。", "ip": "中国 天津", "count": 82, "articleTopic": 88842223, "status": "已发布" }, { "id": 60748618, "title": "HUDI部署与spark集成", "sendDate": 1701086002000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/60748618/trends_text.txt", "imagesSrc": [ "https://hudi.apache.org/assets/images/hudi-lake-overview-e39f80337517a0a1999d8eb5cd0ac965.png" ], "description": "有关hudi 的部署 以及 spark hudi 集成的操作文档", "ip": "中国 天津", "count": 16, "articleTopic": 83499744, "status": "已发布" }, { "id": 34455384, "title": "离线数据处理作答(第一章-公共)", "sendDate": 1701085146000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/34455384/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/2402975/image/537558b6-f5dd-48ad-5ba1-21e93e582442.png?time=1701072387138" ], "description": "涵盖了数据抽取,数据清洗与指标计算的题目以及作答详情", "ip": "中国 天津", "count": 19, "articleTopic": 88842223, "status": "已发布" }, { "id": 97871298, "title": "原神,枫丹曲目谱子来啦!", "sendDate": 1701012026000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/97871298/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-19403739/image/%E9%8F%83%E7%8A%B3%E7%88%A3%E6%A3%B0%EF%BF%BD.png?time=1700141434098" ], "description": "《苍水晶的行歌》《露景泉》为 原神 中的曲子!", "ip": "中国 天津", "count": 25, "articleTopic": 20619125, "status": "已发布" }, { "id": 62123467, "title": "Java,枚举类(enum-class)的使用", "sendDate": 1701011874000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/62123467/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-90457712/image/ENUM.png" ], "description": "在 Java 中,枚举,是一种特殊的类,是一个 常用的 JAVA-编程知识,我们将使用案例与解释让大家认识枚举 。", "ip": "中国 天津", "count": 12, "articleTopic": -24041439, "status": "已发布" }, { "id": -15790370, "title": "正则表达式-Java篇", "sendDate": 1700921451000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/-15790370/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-84814346/image/%E5%A7%9D%EF%BD%85%E5%9E%AF%E7%81%8F%E4%BE%80%E6%BD%B01.jpg?time=1700141236279" ], "description": "文章描述了有关 Java 处理 正则 相关的知识文库,敬请阅读!", "ip": "中国 天津", "count": 25, "articleTopic": 17055036, "status": "已发布" }, { "id": 55591292, "title": "数组是什么?-Java版", "sendDate": 1700913400000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/55591292/trends_text.txt", "imagesSrc": [ "https://img0.baidu.com/it/u=55005685,603479748&fm=253&fmt=auto&app=138&f=PNG?w=364&h=200" ], "description": "数组 ( Array ) 是一种 数据结构 ,从名字中可以知道是 数字的组合 。本文使用 Java 演示数组使用。", "ip": "中国 天津", "count": 17, "articleTopic": -24041439, "status": "已发布" }, { "id": -80651947, "title": "配置hosts文件以实现IP映射-本地域名配置", "sendDate": 1700913207000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/-80651947/trends_text.txt", "imagesSrc": [ "https://img2.baidu.com/it/u=3561316732,1389843867&fm=253&fmt=auto&app=138&f=JPEG?w=475&h=245" ], "description": "在计算机网络中, IP映射 是一种常见的网络配置,它可以将域名解析为对应的 IP地址 。然而,有时候我们可能需要在本地主机上进行 IP映射 ,以便更方便地进行网络通信。本文将介绍如何配置 hosts文件 以实现 IP映射 ,帮助您轻松地实现这一目标。", "ip": "中国 天津", "count": 16, "articleTopic": -33572423, "status": "已发布" }, { "id": 43641703, "title": "正则表达式-常用正则表达式汇总", "sendDate": 1700913075000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/43641703/trends_text.txt", "imagesSrc": [ "https://img0.baidu.com/it/u=4112365988,4219969191&fm=253&fmt=auto&app=138&f=JPEG?w=448&h=248" ], "description": "你需要的 正则 有没有在这里呢?快来看一看吧!", "ip": "中国 天津", "count": 18, "articleTopic": 17055036, "status": "已发布" }, { "id": -90216728, "title": "正则表达式-python篇", "sendDate": 1700913041000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/-90216728/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/81846359/image/97bad9500b845ce3144b3702fb951983.jpeg?time=1700745933664" ], "description": "文章描述了有关 python 处理 正则表达式 相关的知识文库,敬请阅读!", "ip": "中国 天津", "count": 9, "articleTopic": 17055036, "status": "已发布" }, { "id": 65428969, "title": "【网站公告】关于网站交互功能暂时关闭-注册与登录服务暂停的通知", "sendDate": 1700744829000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/65428969/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/24472230/image/%E9%8D%A5%E5%89%A7%E5%A2%961.png?time=1700744811893" ], "description": "由于一些运营原因,我们的网站的对于普通用户的交互功能暂时关闭,故而无法进行注册和登录服务。对于网站中资源的访问,将不受影响,针对文章的发布,由管理者团队代发。", "ip": "中国 天津", "count": 14, "articleTopic": 79268899, "status": "已发布" }, { "id": -4633602, "title": "文章功能开始上线啦", "sendDate": 1700492691000, "sendId": 4, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/zhao4/trends/-4633602/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-756675/image/maxOutSizeImage.svg.png?time=1700128809156" ], "description": "【全新功能上线!】打造更强大的文章体验,让您轻松创作、分享精彩内容!", "ip": "中国 天津", "count": 26, "articleTopic": 79268899, "status": "已发布" }, { "id": -90585683, "title": "正则表达式-基础知识", "sendDate": 1700492366000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/-90585683/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-91799074/image/%E5%A7%9D%EF%BD%85%E5%9E%AF%E9%8D%A5%E7%82%AC%E7%88%A3.jpg?time=1700136030606" ], "description": "文章描述了有关正则表达式相关的知识文库,敬请阅读!", "ip": "中国 天津", "count": 28, "articleTopic": 17055036, "status": "已发布" }, { "id": 86382276, "title": "网站使用手册-第一篇-文章创作", "sendDate": 1700473524000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/86382276/trends_text.txt", "imagesSrc": [ "http://lsb.lingyuzhao.top:8080/LS-WebBackEnd/resources_space/user_space/root1/trends/-38819245/image/%E7%81%8F%E4%BE%80%E6%BD%B0%202023-11-17%20220732.png?" ], "description": "您可以在这里查询到有关网站中文章中心的一些信息,以及其使用方法!", "ip": "中国 天津", "count": 42, "articleTopic": 79268899, "status": "已发布" }, { "id": 28769805, "title": "我是一只小小小鸟", "sendDate": 1700237614000, "sendId": 3, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/Magic3/trends/28769805/trends_text.txt", "imagesSrc": [ "image/defAcImage.svg" ], "description": "Magic 最喜欢这首歌了 分享给你们", "ip": "中国 天津", "count": 35, "articleTopic": 20619125, "status": "已发布" }, { "id": 99790527, "title": "【spark&algorithmStar】基于Spark与AS机器学习库进行常驻捐赠者数据挖掘", "sendDate": 1700141508000, "sendId": 1, "visibility": "所有人可见", "dataFSPath": "/opt/web/LS-Web/user_space/root1/trends/99790527/trends_text.txt", "imagesSrc": [ "https://pic2.zhimg.com/80/v2-cae7aadd953bae48e793011563287f91_720w.webp" ], "description": "【spark&algorithmStar】基于Spark与AS机器学习库进行常驻捐赠者数据挖掘,实现数据分析案例", "ip": "中国 天津", "count": 20, "articleTopic": 88842223, "status": "已发布" } ], "RES": "ok!!!!" } ``` ### 解答 ``` // 准备一个计数器 let count = 0; // 将 json 数据的 trends_all 属性提取出来 let datasetElement = dataset['trends_all']; // trends_all 属性对应的是一个列表,列表中包含的就是文章 因此我们在这里直接迭代列表即可 for (let i = 0; i < datasetElement.length; i++) { // 获取到每个文章 的 json let obj = datasetElement[i]; // 在这里我们需要判断专题属性是否为 数据分析案例 的 id 88842223 if (obj['articleTopic'] === 88842223){ // 如果是就代表需要计数 这个文章就是我们需要的 count++; } } // 最后打印结果 console.info("数据分析案例专题中的文章有:" + count + " 篇") ``` 下面是运行结果 ``` 数据分析案例专题中的文章有:3 篇 ``` =未完待续= ---- 相关文章 - [《前端 json 对象数据处理方法汇总》](http://www.lingyuzhao.top/?/linkController=/articleController&link=-28687176 "《JavaScript 中的数据类型以及常见的数据处理手段》") - [《JavaScript 中的数据类型以及常见的数据处理手段》](http://www.lingyuzhao.top/?/linkController=/articleController&link=15581853 "《JavaScript 中的数据类型以及常见的数据处理手段》") - [《Axios与ECharts进行数据可视化案例》](http://www.lingyuzhao.top/?/linkController=/articleController&link=-15471917 "《Axios与ECharts进行数据可视化案例》") ------ ***操作记录*** 作者:[root](http://www.lingyuzhao.top//index.html?search=1 "root") 操作时间:2023-12-02 16:42:44 星期六 事件描述备注:保存/发布 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)