JSON.parse

本文介绍了JSON.parse方法,用于将JSON格式的字符串转化为JavaScript对象。详细阐述了JSON格式的规定,包括字符串、数值、布尔值、null等简单值以及对象和数组的规则。同时提到了JSON.parse的使用方法及其可选的reviver参数,以及两种替代方法:eval()和new Function。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSON.parse是将一个JSON格式的字符串转换成js对象(JSON对象)。

首先来简单说下JSON字符串,在前后端进行数据传输过程中,JSON是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以需要将其进行转换。那么JSON格式是什么呢?

JSON格式就是表示一系列的“值”的方法,这些值包含在数组或对象之中,是它们的成员。

对于这一系列的“值”,有如下几点格式规定:

  • 数组或对象的每个成员的值,可以是简单值,也可以是复合值。

  • 简单值分为四种:字符串、数值(必须以十进制表示)、布尔值和null,(NaN,Infinity,-Infinity和undefined都会被转为null)。

  • 复合值分为两种:符合JSON格式的对象和符合JSON格式的数组。

  • 数组或对象最后一个成员的后面,不能加逗号。

  • 数组或对象之中的字符串必须使用双引号,不能使用单引号。

  • 对象的成员名称必须使用双引号。

eg:

合格的JSON:

{
    "name":"Tom",
    "age":18,
    "hobby":["music","play"]
}

[{"animal":"dog"},{"animal":"cat"}]

不合格的JSON

{"name":"Lucky",'age':32 }  // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

{"name":"Lucky",age:undefined } // 不能使用undefined

{ 
    "name": "Lucky",
    "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
    "getName": function() {
        return this.name;
    }
} // 不能使用函数和日期对象

注意:空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。

1.方法的定义

JSON.parse(text[,reviver])

参数一:需要解析成JavaScript值的字符串

参数二:可选参数,用来修改解析生成的值,该参数调用在解析函数返回之前。

返回值:Object

eg:

JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null
JSON.parse('1');               //  1


// 若传入的字符串不符合JSON规范,会抛出 SyntaxError 异常
//JSON.parse("'String'") // Uncaught SyntaxError: Unexpected token ... in JSON

// 处理解析错误,可以将JSON.parse方法放在try...catch代码块中。
try{
    JSON.parse("'String'")
}catch(err){
    console.log(err)
}


//传入第二个参数
function f(key, value) {
  if ( key === ""){
      return value;
  }
  if ( key === "a" ) {
    return value + 10;
  }
}
var o = JSON.parse('{"a":1,"b":2,"":23}', f);
o // {a: 11, "": 23}
o.a // 11
o.b // undefined

2.除了JSON.parse外,JavaScript中还有两种常用的方法用于字符串转JSON对象。

   1)使用eval()

// 为什么eval()解析的时候要加括号?
// 那是因为eval()相当于一个执行环境,当你不加括号的时候,str 会被认为是一条复合语句。
// 运行的时候就会逐个字符的解析,当加上括号的时,str 就当做一个表达式去运算。
// 从括号开始就被当做了对象进行识别。
var str =  '{"name":"zhangsan","age":18,"gender":"man"}';
eval('('+str+')');  // 格式: eval( '(' + string + ')' );


// eval在解析字符串时,会执行该字符串中的代码。
// 这样的做法是危险的,一般不建议用eval解析
var num = 1;
var jsonstr = '{"name":"zhangsan","age":++num}';
var jsondata1 = eval('('+jsonstr+')');
console.log(jsondata1);
console.log(num);//这时num值为2

var jasondata2=JSON.parse(jsonstr);
console.log(jsondata2);//报错

   2)使用new Function

function toJson(str){
    var json = (new Function("return " + str))();
    return json;
}
// IE6/7中当字符串中含有换行(\n)时,new Function不能解析,但eval却可以。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值