使用js把json字符串转为js对象的方法

本文深入探讨了JSON解析的早期方法及现代标准的引入,包括原始的`eval`方式、`newFunction`形式和使用全局JSON对象的方法。文章详细展示了每种方法的优缺点,并通过实例代码进行说明,特别强调了JSON规范的重要性,以及不同浏览器的支持情况。此外,还对比了使用JSON.parse与传统方法的区别,包括属性名的引用方式和解析错误处理。

ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法。

1,eval方式解析,恐怕这是最早的解析方式了。如下:

复制代码代码如下:

function strToJson(str){ 
var json = eval('(' + str + ')'); 
return json; 

记得别忘了str两旁的小括号。 

这里属性名可以使用数字,可以带引号也可以不带引号。如果属性名是纯数字,生成的对象属性可以用下表运算符[]来访问,不能用obj.123这样的方式访问。

 1         var str1 = "{\"fa\":123,fb:333,\"fc\":\"xxx\",123:'xyz'}";
 2         var obj1 = eval("(" + str1 + ")");
 3         document.writeln("obj1.fa=" + obj1.fa);
 4         document.writeln("obj1.fb=" + obj1.fb);
 5         document.writeln("obj1.fc=" + obj1.fc);
 6         //document.writeln("obj1.123=" + obj1.123);//语法错误
 7         document.writeln("obj1[fa]=" + obj1["fa"]);
 8         document.writeln("obj1[fb]=" + obj1["fb"]);
 9         document.writeln("obj1[fc]=" + obj1["fc"]);
10         document.writeln("obj1[123]=" + obj1[123]);
11         document.write("<br/>");

 


2,new Function形式,比较怪异哦。如下 

复制代码代码如下:

function strToJson(str){ 
var json = (new Function("return " + str))(); 
return json; 
 1         var str2 = "{\"fa\":123,fb:333,\"fc\":\"xxx\",123:'xyz'}";
 2         var obj2 = (new Function("return" + str2))();
 3         document.writeln("obj2.fa=" + obj2.fa);
 4         document.writeln("obj2.fb=" + obj2.fb);
 5         document.writeln("obj2.fc=" + obj2.fc);
 6         //document.writeln("obj1.123=" + obj1.123);
 7         document.writeln("obj2[fa]=" + obj2["fa"]);
 8         document.writeln("obj2[fb]=" + obj2["fb"]);
 9         document.writeln("obj2[fc]=" + obj2["fc"]);
10         document.writeln("obj2[123]=" + obj2[123]);
11         document.write("<br/>");

 


3,使用全局的JSON对象,如下: 

复制代码代码如下:

function strToJson(str){ 
return JSON.parse(str); 


目前 IE8(S)/Firefox3.5+/Chrome4/Safari4/Opera10 已实现了该方法,以下是部分资料:http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx https://developer.mozilla.org/en/Using_JSON_in_Firefox 
使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

复制代码代码如下:

var str = '{name:"jack"}'; 
var obj = JSON.parse(str); // --> parse error 


name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。 另外必须用双引号包围属性名,单引号会有解析错误,范例:

 1         var str3 = "{\"fa\":123,\"fb\":333,\"fc\":\"xxx\",\"123\":321}";
 2         var obj3 = JSON.parse(str3);
 3         document.writeln("obj3.fa=" + obj3.fa);
 4         document.writeln("obj3.fb=" + obj3.fb);
 5         document.writeln("obj3.fc=" + obj3.fc);
 6         //document.writeln("obj1.123=" + obj1.123);
 7         document.writeln("obj3[fa]=" + obj3["fa"]);
 8         document.writeln("obj3[fb]=" + obj3["fb"]);
 9         document.writeln("obj3[fc]=" + obj3["fc"]);
10         document.writeln("obj3[123]=" + obj3[123]);
11         document.write("<br/>");
12 
13         try{
14             var str4 = "{fa:123,\"fb\":333,\"fc\":\"xxx\",\"123\":321}";
15             var obj4 = JSON.parse(str4);
16         } catch (err) {
17             document.write(err.name+":"+err.message);
18         }
19         document.write("<br/>");
20         try{
21             var str5 = "{'fa':123,\"fb\":333,\"fc\":\"xxx\",\"123\":321}";
22             var obj5 = JSON.parse(str4);
23         } catch (err) {
24             document.write(err.name + ":" + err.message);
25         }

 


另见:Chrome中JSON.parse的特殊实现

<think> 我们被要求回答关于JavaScript中将JSON字符串转换为JSON对象方法。 根据引用[1]、[3]和[4],我们知道可以使用`JSON.parse()`方法来实现。 引用[1]明确指出:在JavaScript中,可以使用JSON.parse()方法来将JSON字符串转换为JSON对象。 引用[3]也提到:JSON.parse是JavaScript中的一个全局方法,用于将一个JSON字符串转换为JavaScript对象。 引用[4]则区分了JSON字符串JSON对象,并指出转换是关键。 因此,我们的回答将围绕`JSON.parse()`方法展开,包括基本用法、错误处理以及注意事项。 同时,我们还要生成相关问题。 注意:我们之前回答的是Java中的JsonMapper,现在用户问的是JavaScript中的转换方法,所以不要混淆。 回答结构: 1. 核心方法JSON.parse() 2. 基本用法示例 3. 错误处理(try-catch) 4. 注意事项(如JSON字符串的格式要求) 5. 其他相关方法JSON.stringify()的简单提及,因为引用[2]提到了) 6. 生成相关问题 注意:由于用户只问了转换字符串对象,所以我们主要回答这个,但可以简单提及反向操作(对象字符串)作为补充。 引用标注:在适当的地方标注引用,如[^1][^3][^4]。 </think> 在 JavaScript 中,将 JSON 字符串转换为 JSON 对象的标准方法使用内置的 `JSON.parse()` 函数。这是最常用且推荐的方式,以下是详细解析: ### 1. **核心方法:`JSON.parse()`** ```javascript const jsonString = '{"name": "Alice", "age": 30}'; const jsonObject = JSON.parse(jsonString); // 字符串对象 console.log(jsonObject.name); // 输出: Alice [^1][^3] ``` - **工作原理**:解析有效的 JSON 字符串,返回等效的 JavaScript 对象 - **语法**:`JSON.parse(text[, reviver])` - `text`:必填,有效的 JSON 字符串 - `reviver`:可选函数,可在解析过程中修改结果 ### 2. **完整使用示例** ```javascript // 简单对象解析 const userStr = '{"id": 101, "active": true}'; const user = JSON.parse(userStr); console.log(user.active); // true // 解析数组 const fruitsStr = '["apple", "banana", "orange"]'; const fruits = JSON.parse(fruitsStr); console.log(fruits[1]); // "banana" // 带 reviver 函数的解析(转换日期) const dataStr = '{"date": "2023-01-15"}'; const data = JSON.parse(dataStr, (key, value) => { if (key === "date") return new Date(value); return value; }); console.log(data.date.getFullYear()); // 2023 [^3] ``` ### 3. **关键注意事项** 1. **有效性验证** 无效 JSON 会抛出 `SyntaxError`,需用 `try/catch` 处理: ```javascript try { JSON.parse('{name: "John"}'); // 缺少双引号 } catch (e) { console.error("无效JSON:", e.message); // 输出错误信息 } ``` 2. **安全风险** **禁止解析不可信来源的 JSON**,可能包含恶意代码: ```javascript // 危险示例!可能执行攻击代码 JSON.parse('{"__proto__": {"isAdmin": true}}'); ``` 3. **数据类型映射规则** | JSON 类型 | JavaScript 类型 | |----------------|-----------------| | String | String | | Number | Number | | Object | Object | | Array | Array | | `true`/`false` | Boolean | | `null` | `null` | ### 4. **与其他方法的对比** - **`eval()`(不推荐)** 虽然能解析 JSON,但会执行任意代码,存在严重安全隐患: ```javascript // 危险!避免使用 const obj = eval('(' + jsonString + ')'); ``` - **`new Function()`** 比 `eval` 稍安全但仍需谨慎使用: ```javascript const obj = new Function('return ' + jsonString)(); ``` > **最佳实践**:始终优先使用 `JSON.parse()`,它是 ECMAScript 5 标准的一部分,所有现代浏览器均支持[^1][^3]。 ### 5. **反向操作:对象字符串** 使用 `JSON.stringify()` 实现反向转换: ```javascript const obj = {name: "Bob", score: 95}; const str = JSON.stringify(obj); console.log(str); // '{"name":"Bob","score":95}' [^2] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fancybit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值