两种方式都可以解析json字符串,不过有时候JSON.parse解析会失败,失败原因有多种,下面会指出一种。

JSON.parse()解析json格式的数据,会对要解析的字符串进行格式检查,如果格式不正确则不进行解析,

eval()则可以解析任何字符串,但是eval是不安全的(不安全原因在下面)。

注意:某些低级的浏览器尚不支持JSON.parse(),可以到 https://github.com/douglascrockford/JSON-js/blob/master/json2.js 下载。

使用eval函数,解析json字符串

var dataObj = eval(“(“+json+”)”);

加上圆括号的目的是,迫使eval函数在处理JavaScript代码时,强制将括号内的表达式(expression)转化为对象,而

不是作为语句(statement)来执行。

注意:使用eval函数解析JSON是一种很不安全的方式,能不用最好就不用,原因是eval不但可以解析JSON字符串,还会执行其中的代码块(如果有的话)

使用JSON.parse()方法解析 

var dataObj = JSON.parse(json);

注意:JSON.parse()又是對字符串的真实含义进行解析,要表示 \ 必須要用"\\\\"表示。

使用JSON.parse()解析会报错的一种情况:

  var Student = {
age: "20",
sex:"male"
};
//错误做法
alert(JSON.parse(Student).age);//JSON.parse()不能直接解析对象 //正确做法
var jsonStr=JSON.stringify(Student);
alert(JSON.parese(jsonStr).age);

有时候

题外话:

JSON是Javascript原生格式,这意味着在javascript中处理JSON数据不需要任何特殊的API或工具包,而且效率非常高。

 

JSON.stringify

作用:用于序列化对象,可以理解为把对象类型或者字符串类型转换为JSON类型字符串

语法:JSON.stringify(value,[,replacer][,space])
value:必选,要输出的对象
replacer:可选,过滤器,有两种情况,一种是方法,一种是数组,具体看示例
方法:把序列化后的每个对象传递到方法里面进行处理,
数组:如果前面要转换的是一个对象,如{name:"zhang",age:"20"},则在数组包含的该key的元素会被筛选出来
space:可选,使用什么来分割,具体看示例
示例:

/*
* 只有第一个参数
*/
var Student = {
age: "20",
sex:"male"
};
//stringify()用于从一个对象解析出字符串
var jsonString = JSON.stringify(Student);
alert(jsonString); var person = new Object();
person.name = "xiao wang";
person.age = "20";
person.location = "china";
var personjson = JSON.stringify(person);
alert(personjson); /*
* 有两个参数,第一个参数是对象,第二个参数是数组
*/
var person = new Object();
person.name = "xiao wang";
person.age = "20";
person.location = "china"; var filter = ["name"]; var personjson = JSON.stringify(person,filter);
alert(personjson);
/*
* 有两个参数,第一个参数是数组,第二个参数是数组(计算结果是第二个参数忽略)
*/
var person = ["zhangsan", "20", "male", "china"];
var filter = ["zhangsan", "china"];
var jsonperson = JSON.stringify(person, filter);
alert(jsonperson); /*
* 有两个参数,第一个参数是数组,第二个参数是函数
*/
function switchUpper(key, value) {
return value.toString().toUpperCase();
}
var person = ["zhangsan", "20", "male", "china"]; var jsonperson = JSON.stringify(person, switchUpper);
alert(jsonperson); /*
*有两个参数,第一个参数是对象,第二个参数是函数
*/
var person = new Object();
person.name = "xiao wang";
person.age = "20";
person.location = "china"; var jsonperson = JSON.stringify(person, function (key, value) {
switch (key) {
case "name":
return "zhang";
default:
return value;
}
});
alert(jsonperson); /*
* 有三个参数,如果省略的话,那么显示出来的值就没有分割符,
* 如果是数组的话,那么它定义缩进的字符,如果大于10,则最多显示10个
* 如果是一些转义字符,如"\t",表示回车,那么它每一行一个回车
* 如果仅仅是字符串,就在每行输出值得时候把这些字符串附加上去,当然最大长度是10个字符
*/
//空格
var person = ["name", "age", "sex", "location"];
var jsonperson = JSON.stringify(person, null, 20);
alert(jsonperson);
//字符
var person = ["name", "age", "sex", "location"];
var jsonperson = JSON.stringify(person, null, "hi");
alert(jsonperson);

上面的例子复制自文章:

标题:eval、JSON.parse和JSON.stringify;

地址:http://blog.csdn.net/u011872945/article/details/38664405

JSON.parse与eval区别的更多相关文章

  1. JSON.parse()和eval()区别

    JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...

  2. JSON.parse与eval的区别

    JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别. 测试代码 var A = "{ a: 1 , b : 'hello' }"; var B ...

  3. JSON.parse和eval的区别

    JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...

  4. JSON.parse()和eval()的区别

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  5. JSON.stringify()、JSON.parse()和eval(string)

    1.JSON.stringify()用于从一个对象解析出字符串,eg: var obj = {"name":"奔跑的蜗牛","age":&q ...

  6. 用JSON.parse和eval出现的问题

    json格式非常受欢迎,而解析json的方式通常用JSON.parse()但是eval()方法也可以解析,这两者之间有什么区别呢? JSON.parse()之可以解析json格式的数据,并且会对要解析 ...

  7. JS中JSON.parse和eval的异同

    1.相同点 JSON.parse和eval函数都可将一段json字符串转换为json对象,如: var json = '{"intro":[{"name":&q ...

  8. JSON.parse与eval

    文章:JSON.parse 与 eval() 对于解析json的问题 json的标准格式:{"name":"jobs"}   名字和值都必须用双引号引起来.

  9. javascript JSON.parse和eval的区别

    SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...

随机推荐

  1. [windows]设置使用空白密码进行远程登录

    前提:系统用户设置了空白密码 方法1步骤: 开始菜单--〉运行--〉输入:gpedit.msc--> 计算机配置--〉Windows设置--〉安全设置--〉本地策略--〉安全选项:帐户:使用空白 ...

  2. ThreadLocal应用场景以及源码分析

    一.应用篇 ThreadLocal介绍 ThreadLocal如果单纯从字面上理解的话好像是“本地线程”的意思,其实并不是这个意思,只是这个名字起的太容易让人误解了,它的真正的意思是线程本地变量. 实 ...

  3. jmeter中登录和提交收银出现的错误

    登录出现的错误 登录界面如图所示: 为了防止登录跳转的问题response code 302的问题,要设置 2.提交收银界面 当系统设置必须传送jison格式时,要在HTTP Header Manag ...

  4. Java面试题全集(下)

    这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...

  5. Shell脚本之for循环、while循环,if语句、case语句

    1. for循环一般格式: 格式1: for((条件)) do 动作 done 格式2: for 变量名 in 范围 do 动作 done1234567891011121314实验:##1. 输出数字 ...

  6. Vue 打印预览功能

    需求有几种情况: 1.直接在HTML写页面,将页面上的东西用A4纸打印出来: 2.后台传回PDF文件,前台浏览器预览并打印: 3.后台做好要打印的,传回图片,如base64编码,前台浏览器 预览并打印 ...

  7. 手把手教你打造一个 Mac 风格的 Windows10(手动滑稽)

    Mark  https://www.sqlsec.com/2018/04/winmac.html 大佬写得很好,资瓷!! MyDock可能不是最新的,给出官方维护的网盘:https://pan.bai ...

  8. POI创建生成excel及设置相关属性

    简单的读写到excel中: import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io. ...

  9. 基于PassThru的NDIS中间层驱动程序扩展

    基于PassThru的NDIS中间层驱动程序扩展                                  独孤求真 概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身 ...

  10. Mac更改显存

    今天尝试了 发现很有效果 不敢独享 所以贴一下,如果我火星了 ..就无视我吧 问题表现为: 1. 随机出现花屏,和 横线. 随机出现死机2. 随着再次渲染(例如桌面背景切换),花屏或横线会消失3. 当 ...