全部现代浏览器都支持 JSON 对象,有两个很是有用的方法来处理 JSON 格式的内容:javascript
好比我有两个变量,我要将a转换成字符串,将b转换成JSON对象:html
var a={"name":"tom","sex":"男","age":"24"}; var b='{"name":"Mike","sex":"女","age":"29"}';
在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接能够用JSON对象的stringify()和parse()方法。java
JSON.stringify(obj)将JSON转为字符串。git
JSON.parse(string)将字符串转为JSON格式;github
上面的转换能够这么写:chrome
var a={"name":"tom","sex":"男","age":"24"}; var b='{"name":"Mike","sex":"女","age":"29"}'; var aToStr=JSON.stringify(a); var bToObj=JSON.parse(b); console.log(typeof(aToStr)); ?//string console.log(typeof(bToObj));//object
尽管这些方法一般用在对象上,但它们也能够在数组上使用:json
const myArr = ['bacon', 'letuce', 'tomatoes']; const myArrStr = JSON.stringify(myArr); console.log(myArrStr); // "["bacon","letuce","tomatoes"]" console.log(JSON.parse(myArrStr)); // ["bacon","letuce","tomatoes"]
ie8(兼容模式),ie7和ie6没有JSON对象,不过http://www.json.org/提供了一个json.js,这样ie8(兼容模式),ie7和ie6就能够支持JSON对象以及其stringify()和parse()方法;你能够在https://github.com/douglascrockford/JSON-js上获取到这个js,通常如今用json2.js。api
ie8(兼容模式),ie7和ie6可使用eval()将字符串转为JSON对象,数组
var c='{"name":"Mike","sex":"女","age":"29"}'; var cToObj=eval("("+c+")"); console.log(typeof(cToObj));
var c='[{"name":"Mike","sex":"女","age":"29"}]'; var cToObj=eval(c); console.log(typeof(cToObj));
jQuery中也有将字符串转为JSON格式的方法jQuery.parseJSON( json ),接受一个标准格式的 JSON 字符串,并返回解析后的 JavaScript (JSON)对象。固然若是有兴趣能够本身封装一个jQuery扩展,jQuery.stringifyJSON(obj)将JSON转为字符串。浏览器
JSON.parse() 和 JSON.stringify() 的高级用法,能够将返回值过滤,转换等。请查看:https://www.html.cn/archives/8735
这里介绍一下,我主要介绍一下 JSON.parse() 和 JSON.stringify() 的高级用法,能够在实际应用中给咱们带来一些方便。
JSON.parse()
能够接受第二个参数,它能够在返回以前转换对象值。好比这例子中,将返回对象的属性值大写:
const user = { name: 'John', email: 'john@awesome.com', plan: 'Pro' }; const userStr = JSON.stringify(user); const newUserStr = JSON.parse(userStr, (key, value) => { if (typeof value === 'string') { return value.toUpperCase(); } return value; }); console.log(newUserStr); //{name: "JOHN", email: "JOHN@AWESOME.COM", plan: "PRO"}
注:尾随逗号在JSON 中无效,因此若是传递给它的字符串有尾随逗号,JSON.parse()
将会抛出错误。
JSON.stringify() 能够带两个额外的参数,第一个是替换函数,第二个间隔字符串,用做隔开返回字符串。
参数:
替换函数能够用来过滤值,由于任何返回 undefined
的值将不在返回的字符串中:
const user = { id: 229, name: 'John', email: 'john@awesome.com' }; function replacer(key, value) { console.log(typeof value); if (key === 'email') { return undefined; } return value; } const userStr = JSON.stringify(user, replacer); // "{"id":229,"name":"John"}"
传入一个间隔参数的示例:
const user = { name: 'John', email: 'john@awesome.com', plan: 'Pro' }; const userStr = JSON.stringify(user, null, '...'); // "{ // ..."name": "John", // ..."email": "john@awesome.com", // ..."plan": "Pro" // }"
若是一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化
var obj = { foo: 'foo', toJSON:function(){ return 'bar'; } } JSON.stringify(obj);//'"bar"' JSON.stringify({x:obj});//'{"x":"bar"}'
利用toJSON方法,咱们能够修改对象转换成JSON的默认行为。
在实际使用中,咱们可能会格式化一些复杂的对象,这些对象每每对象内嵌套对象。直接看起来并不那么直观,结合上面的的 replacer 和 space 参数,咱们能够这样格式化复杂对象:
var censor = function(key,value){ if(typeof(value) == 'function'){ return Function.prototype.toString.call(value) } return value; } var foo = {bar:"1",baz:3,o:{name:'xiaoli',age:21,info:{sex:'男',getSex:function(){return 'sex';}}}}; console.log(JSON.stringify(foo,censor,4))
实际返回的字符串,记住是字符串,以下:
{ "bar": "1", "baz": 3, "o": { "name": "xiaoli", "age": 21, "info": { "sex": "男", "getSex": "function (){return 'sex';}" } } }