JavaScript解析JSON对象及JSON字符串

devtools/2024/10/25 5:07:26/

1、问题概述?

JavaScript解析JSON对象是常用功能之一。

此处我们要明确JSON对象和JSON字符串的区别?否则会给我们的解析带来困扰。

主要实现如下功能:

1、JavaScript解析JSON字符串JSON对象?

2、JavaScript解析JSON数组?

3、JavaScript解析来自springboot通过@ResponseBody返回的JSON字符串?

4、禁用eval后如何替代eval?

1.1、什么是JSON对象

JSON对象的本质是一个对象,对象中属性的值可以通过object.name的方式访问。

JavaScript定义方式如下:

var obj={“name”:”晓春”,”sex”:”男”};

直接通过obj.name返回值为晓春

1.2、什么是JSON字符串

JSON字符串的本质是一种由规律的字符串,不能通过object.name的方式获取。

JavaScript定义方式如下:

与JSON对象相比,套在’’或者””即可

var obj=’{“name”:”晓春”,”sex”:”男”}’;

直接通过obj.name返回值为undefined

2、JSON对象和对象JSON字符串的使用方式

2.1、JSON字符串的使用

JSON字符串的使用需要先讲JSON字符串转化成JSON对象。

具体使用方式如下:

var jsonString='{"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}}';
var jsonObject=JSON.parse(jsonString);
console.log(jsonObject.hobby); //输出结果为{"hobby1":"编程"}

后续使用方式与JSON对象相同

2.2、JSON对象的使用方式

【通过object.name的方式获取】

var jsonString={"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}};console.log(jsonString.name);//输出结果为: 晓春

【通过object[‘name’]的方式】

var jsonString={"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}};
console.log(jsonString['name']);

【通过Object.values统一取值】

Object.values(jsonString);//取出当前所有属性对应的值

var jsonString={"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}};
//将所有属性的值转化成数组类型的参数
var jsonValues=Object.values(jsonString);
//输出结果为晓春
console.log(jsonValues[0]);

【通过Object.keys()获取所有对象的键名】

Object.keys()获取JSON对象的所有键名并返回一个数组类型的参数。

var jsonString={"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}};
//将所有属性的值转化成数组类型的参数
var jsonkeys=Object.keys(jsonString);
//输出结果为晓春
console.log(jsonString[jsonkeys[0]]);

【如果对象的属性是一个变量】

var jsonString={"name":"晓春","sex":"男","hobby":{"hobby1":"编程"}};
var attributeName="name";//name为传入属性的名称
console.log(jsonString[attributeName]);

3、JSON数组解析

【JSON字符串数组】

先通过JSON.parse将字符串转化成数组

//数组类型的jsonvar jsonString= '[{"name":"晓春","sex":"男"},{"name":"大春","sex":"男"}]';
var jsonArray=JSON.parse(jsonString);
for(var i=0;i<jsonArray.length;i++){//输出结果:{"name":"晓春","sex":"男"},输出结果晓春console.log(jsonArray[i]);//获取name,输出结果晓春console.log(jsonArray[i].name);
}

【JSON数组-通过JSON.parse解析】

//数组类型的json
var jsonArray=[{"name":"晓春","sex":"男"},{"name":"大春","sex":"男"}];
for(var i=0;i<jsonArray.length;i++){//输出结果:{"name":"晓春","sex":"男"},输出结果晓春console.log(jsonArray[i]);//获取name,输出结果晓春console.log(jsonArray[i].name);
}

输出结果:

【JSON数组-通过eval解析】

eval可以将json字符串转化成json数组,但是需要注意,json字符串必须是数组类型

也就是必须包含[]

//数组类型的json
var jsonString= '[{"name":"晓春","sex":"男"},{"name":"大春","sex":"男"}]';
var jsonArray=eval(jsonString);
for(var i=0;i<jsonArray.length;i++){//输出结果:{"name":"晓春","sex":"男"},输出结果晓春console.log(jsonArray[i]);//获取name,输出结果晓春console.log(jsonArray[i].name);
}

4、Springboot返回值说明

springboot工程中,我们喜欢通过@ResponseBody的方式返回JSON数组,解法与上面的解法相同

【同样使用eval解析即可】

//数组类型的json
var jsonString= '[{"name":"晓春","sex":"男"},{"name":"大春","sex":"男"}]';
var jsonArray=eval(jsonString);
for(var i=0;i<jsonArray.length;i++){//输出结果:{"name":"晓春","sex":"男"},输出结果晓春console.log(jsonArray[i]);//获取name,输出结果晓春console.log(jsonArray[i].name);
}

5、关于eval的说明

禁用eval()
JavaScript中的eval()函数是有潜在危险,而且经常被误用。在不可信的代码里使用eval()有可能使程序受到不同的注入攻击。

在有些大公司里面,会有代码审计系统,审计系统会要求禁用eval(),这个时候就需要替代方案,我们此处通过jQuery方案进行替代

5.1、如何替代eval()

替代方案方案非常多,介绍使用jQuery的方式替代eval()

【后端返回值】

后端可采用@ResponseBody将对象转化成json字符串。

[{"name":"晓春","sex":"男","age":"30","address":"安徽合肥","password":"123456"},{"name":"十一郎","sex":"男","address":"安徽合肥","password":"123456"},
]

5.2、原有的eval()方案

提示:eval()是一个危险的函数,它使用与调用者相同的执行权限......

$.ajax({type:"get",url:"/test"cache:false,dataType:"text",success:function(data){var result = eval(data);      for(var i=0;i<result.length;i++){console.log(result[i].name);}}
});

5.3、jQuery的$.each替代方案

替代方案中使用了jQuery的each循环替代了原有的eval用法

定义数组的时候建议使用如下方式:

var result=[];否则会提示:The array literal notation [] is preferable.(no-array-constructor)

$.ajax({type:"get",url:"/test"cache:false,dataType:"text",success:function(data){var jsonData=JSON.parse(data);var result=[];//代码规则不建议使用var result=new Array();$.each(jsonData,function(index,obj){result.push(obj);});for(var i=0;i<result.length;i++){console.log(result[i].name);}}
});

对你有帮助,点赞和关注,就是我们创作最大的动力。


http://www.ppmy.cn/devtools/128596.html

相关文章

python_学习2(仅为本人学习记录)

二、变量与字符串 1、变量的声明和赋值 a.变量在使用前必须要先赋值 b.删除变量&#xff0c;可以通过del语句删除。 a123 del a c.链式赋值 xy123 相当于 x123;y123 d.解包赋值 a,b,c1,2,3 相当于 a1 b2 c3 使用解包赋值给变量交换值&#xff1a;a,b3,4 a,bb,a 2、基本…

【golang】学习文档整理

Binding | Echo 传值时注意零值和传空的区别 需要validate require 和 设置指针配合使用 保证不同值的返回不同 不能客户端传0值被判断为空 测试时要空值零值去测试字段是否正确返回 返回错误是否符合预期

重修设计模式-行为型-访问者模式

重修设计模式-行为型-访问者模式 Allows for one or more operation to be applied to a set of objects at runtime, decoupling the operations from the object structure. 允许一个或者多个操作应用到一组对象上&#xff0c;解耦操作和对象本身。 访问者模式&#xff08;Vi…

MATLAB中head函数用法

目录 语法 说明 示例 显示矩阵的前八行 显示表的前三行 返回表的前八行 head函数的功能是获取数组或表的顶行。 语法 head(A) head(A,k) B head(___) 说明 head(A) 在命令行窗口中显示数组、表或时间表 A 的前八行&#xff0c;但不存储值。 head(A,k) 显示 A 的前 k …

人工智能技术的应用前景及其对生活和工作方式的影响

人工智能技术的应用前景及其对生活和工作方式的影响 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其在各个领域的应用正日益深入&#xff0c;深刻改变着我们的生活和工作方式。本文将系统地探讨人工智能的历史、现状、未来应用前景&#xff0c;以及其对个…

Dockerfile 中 Expose 命令的作用

Dockerfile 中 Expose 命令的作用 格式是&#xff1a;EXPOSE <端口1> [<端口2>...] 例如&#xff1a; EXPOSE 8080 8081 8082 特别注意&#xff1a; EXPOSE 指令是声明容器运行时提供服务的端口&#xff0c;请注意这只是一个声明&#xff0c;并没有实际作用&am…

前端使用xlsx和file-saver自定义导出excel表格,无需写页面直接导出数据。末尾有一个插件方式使用

建议把代码封装成一个函数&#xff0c;这样就不用每个页面都写了&#xff0c;直接调用就好了。 <template><div><h1>导出数据为 Excel</h1><button click"exportToExcel(dynamicData, [name, age, city], [姓名, 年龄, 城市],某某文件)"…

pytorch scatter_ 函数介绍

scatter_ 是 PyTorch 中的一个原地操作函数&#xff0c;用于在给定的索引处将某些值填充到张量的指定维度中。它的常见用途之一是将类别标签转换为 one-hot 编码&#xff0c;不过它也适用于其他场景&#xff0c;如在特定索引处更新张量的值。 scatter_ 函数的签名如下&#xf…