java json不能使用_是否无法使用JSON.stringify对错误进行字符串化?

重现问题

尝试使用Web套接字传递错误消息时遇到问题 . 我可以使用 JSON.stringify 复制我面临的问题,以迎合更广泛的受众:

// node v0.10.15

> var error = new Error('simple error message');

undefined

> error

[Error: simple error message]

> Object.getOwnPropertyNames(error);

[ 'stack', 'arguments', 'type', 'message' ]

> JSON.stringify(error);

'{}'

问题是我最终得到一个空对象 .

我尝试过的

Browsers

我首先尝试离开node.js并在各种浏览器中运行它 . Chrome版本28给了我相同的结果,有趣的是,Firefox至少做了一次尝试,但遗漏了消息:

>>> JSON.stringify(error); // Firebug, Firefox 23

{"fileName":"debug eval code","lineNumber":1,"stack":"@debug eval code:1\n"}

Replacer function

然后我看了Error.prototype . 它显示原型包含toString和toSource等方法 . 知道函数不能被字符串化,我在调用JSON.stringify时删除所有函数时包含一个replacer function,但后来意识到它也有一些奇怪的行为:

var error = new Error('simple error message');

JSON.stringify(error, function(key, value) {

console.log(key === ''); // true (?)

console.log(value === error); // true (?)

});

它似乎不像通常那样循环遍历对象,因此我无法检查密钥是否是函数并忽略它 .

问题

有没有办法用 JSON.stringify 字符串化本机错误消息?如果没有,为什么会出现这种情况?

解决这个问题的方法

坚持使用简单的基于字符串的错误消息,或创建个人错误对象,而不依赖于本机Error对象 .

拉属性: JSON.stringify({ message: error.message, stack: error.stack })

更新

var error = new Error('simple error message');

var propertyNames = Object.getOwnPropertyNames(error);

var descriptor;

for (var property, i = 0, len = propertyNames.length; i < len; ++i) {

property = propertyNames[i];

descriptor = Object.getOwnPropertyDescriptor(error, property);

console.log(property, descriptor);

}

输出:

stack { get: [Function],

set: [Function],

enumerable: false,

configurable: true }

arguments { value: undefined,

writable: true,

enumerable: false,

configurable: true }

type { value: undefined,

writable: true,

enumerable: false,

configurable: true }

message { value: 'simple error message',

writable: true,

enumerable: false,

configurable: true }

关键: enumerable: false .

接受的答案提供了此问题的解决方法 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值