在JavaScript中,JSON.stringify()方式用以将JavaScript目标或值变换为JSON字符串数组。假如目标有toJSON方式,JSON.stringify将启用目标的toJSON方式,并将toJSON方式回到的值做为实例化值。

比如,下列脚本制作等同于JSON.stringify({回答:42})。

const json = JSON.stringify({ answer: { toJSON: () => 42 }});console.log(json); // {"answer":42}

融合ES6类。

ToJSON十分有益于ES6类目标的一切正常实例化。比如,您能够根据不正确种类拓展httpError类。

class HTTPError extends Error { constructor(message, status) { super(message); this.status = status; }}

JavaScript不可以有效地实例化不正确信息。默认设置状况下,下列脚本制作将只輸出:{“情况”:404},沒有不正确信息和不正确局部变量追踪。

class HTTPError extends Error { constructor(message, status) { super(message); this.status = status; }}const e = new HTTPError('Fail', 404);console.log(JSON.stringify(e)); // {"status":404}

可是要是在HTTPError种类中添加toJSON方式,实际效果会更好许多。

class HTTPError extends Error { constructor(message, status) { super(message); this.status = status; } toJSON() { return { message: this.message, status: this.status }; }}const e = new HTTPError('Fail', 404);console.log(JSON.stringify(e)); // {"message":"Fail","status":404}

您也能够根据toJSON方式加上大量调试信息。假如您的NODE_ENV在开发工具中,您能够加上不正确的局部变量信息内容以便于调节。

class HTTPError extends Error { constructor(message, status) { super(message); this.status = status; } toJSON() { const ret = { message: this.message, status: this.status }; if (process.env.NODE_ENV === 'development') { ret.stack = this.stack; } return ret; }}const e = new HTTPError('Fail', 404);// {"message":"Fail","status":404,"stack":"Error: Fail\n at ...console.log(JSON.stringify(e));

toJSON较大的优势便是能够幫助你解决嵌入的信息内容。应用toJSON,您依然能够恰当地实例化二维数组中深层嵌入的HTTPError案例和HTTPError案例。

class HTTPError extends Error { constructor(message, status) { super(message); this.status = status; } toJSON() { return { message: this.message, status: this.status }; }}const e = new HTTPError('Fail', 404);// {"nested":{"message":"Fail","status":404},"arr":[{"message":"Fail","status":404}]}console.log(JSON.stringify({ nested: e, arr: [e]}));

许多类库全是JSON.stringify根据toJSON订制的。比如Express的res.json()方式,Axios POST要求实例化目标等。

toJSON()的具体运用。

Moment.js类库为目标界定了toJSON方式:

function toJSON () { // JSON.stringify(new Date(NaN)) === 'null' return this.isValid() ? this.toISOString() : 'null'; }

您能够立即启用toJSON来实例化日期目标:

const moment = require('moment');console.log(moment('2019-06-01').toJSON.toString());

toJSON方式也是由Node.js缓冲区域目标订制的:

const buf = Buffer.from('abc');console.log(buf.toJSON.toString());// Prints:function toJSON() { if (this.length > 0) { const data = new Array(this.length); for (var i = 0; i < this.length; i) data[i] = this[i]; return { type: 'Buffer', data }; } else { return { type: 'Buffer', data: [] }; }}

mongose文本文档目标还具备toJSON()涵数,以保证mongose文本文档目标的內部情况不容易发生在JSON.stringify()輸出中。

汇总

toJSON()涵数是JavaScript搭建类的主要专用工具。根据这类方法,您能够操纵JavaScript如何把您的类案例实例化为json字符串数组。toJSON()涵数能够协助您处理很多难题,比如保证日期目标文件格式恰当或是Node.js缓冲区域目标被一切正常实例化。下一次结构ES6种类时,一定要还记得试着。

评论(0条)

刀客源码 游客评论