曾经我天真的以为json对象和js对象是一个样子的.. 后来入了坑才知道其实是不一样的- -. 所以在开始之前我先强调一下js对象和json对象这两个对象的文本表现形式的书写格式.
在下文我会按照以下规则对变量进行命名加以区分, 以免混乱:
对象以Obj结尾
1. json对象命名为: jsonObj
2. js对象命名为: jsObj对象的文本表现形式以ObjStr结尾
1. json对象字符串: jsonObjStr
2. js对象字符串: jsObjStr
格式
var jsObj = {name: "tom", age: 12}; // js对象
var jsObjStr = '{name: "tom", age: 12}'; // js对象文本表现形式
var jsonObj = {"name": "jerry", "age": 13}; // json对象
var jsonObjStr = '{"name": "jerry", "age": 16}'; // json对象文本表现形式
可以看到js对象的属性名没有用引号进行包裹, 而json对象的属性名用了引号包裹.
虽然在JavaScript里JSON对象也称为js对象的一种, 在很大程度上都是类似的, 但是在数据传输时我们都是用的JSON来传递, 所以在书写时应该注意相应的格式. 不然在使用Jquery的时候会因为服务端传递的不是json字符串出现错误导致success回调函数无法执行.
上面说完了, 下面开始说一下互相转换.
var jsObj = {name: "tom", age: 15};
var jsObjStr = JSON.stringify(jsObj);
console.log(jsObjstr);
var jsonObj = {"name": "jerry", "age": 16};
var jsonObjStr = JSON.stringify(jsonObj);
console.log(jsonObjStr );
JSON.stringify()方法, 不管传递的是js对象还是json对象都会转成字符串. 而且当传递是一个是js对象时, 转换后的字符串中的属性会自动包裹引号.(实际上是转成json对象字符串了)
文本转对象, 用eval函数可以直接将文本转成对象.
var jsObjStr = '{name: "tom", age: 15}';
var jsObj = eval('('+ jsObjStr +')');
console.log(jsObj);
var jsonObjStr = '{"name": "jerry", "age": 16}';
var jsonObj = eval('('+ jsonObjStr +')');
console.log(jsonObj);
除了上面用eval函数转换json对象文本到json对象以外, 还可以用JSON.parse(jsonObjStr)方法来转换, 但此方法只用于json对象文本.
如果参数传递是js对象文本的话, 那么就会报语法错误
VM2253:1 Uncaught SyntaxError: Unexpected token n in JSON at position 1
var jsonObjStr = '{"name": "jerry", "age": 16}';
var jsonObj = JSON.parse(jsonObjStr);
console.log(jsonObj); // OK
var jsObjStr = '{name: "tom", age: 15}';
var jsObj = JSON.parse(jsObjStr); // 错误
console.log(jsObj);
如果本人说的不易理解, 也可参考: http://www.haorooms.com/post/js_jsons_h