为什么当我在node.js中对来自数据库请求的数据使用JSON.stringify时,会得到数据本身的对象,如果我使用console.log,则会得到很多其他参数,例如dataValues,_previousDataValues,_modelOptions ... 。 我使用sequelize.js
console.log(JSON.stringify(data,'',2))
{
id:1
}
console.log(数据)
Kindergarten_data {
dataValues:
{ id: 1}
_changed: {},
_modelOptions:
{ timestamps: true,
validate: {},
freezeTableName: true,
underscored: false,
underscoredAll: false,
paranoid: false,
rejectOnEmpty: false,
whereCollection: null,
schema: null,
schemaDelimiter: '',
defaultScope: {},
scopes: [],
indexes: [],...
答案 0 :(得分:1)
JSON.stringify()
后面有一个protocol:
JSON.stringify()将值转换为表示它的JSON表示法:
- 如果该值具有
根据传统的转换语义,toJSON()
方法,则负责定义要序列化的数据。Boolean
,Number
和String
对象在字符串化过程中被转换为相应的原始值。- [...]
很明显,您的字符串化内容根本不遵循您在console.log()
上看到的内容,因为您必须看到{ dataValues: {id: 1} ...
,而看到的是{id: 1}
。因此,这并不是其他答案可能建议的一些神秘的“ JSON可表示性”,而是sequelize.js
仅提供了toJSON()
方法,因此它仅以JSON格式导出您的数据,而不是整个基础结构。
方法在这里:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L4226
toJSON() { return _.cloneDeep( this.get({ plain: true }) ); }
它引用的get()
在这里:https://github.com/sequelize/sequelize/blob/master/lib/model.js#L3313
get(key, options) { if (options === undefined && typeof key === 'object') { options = key; key = undefined; } [...] if (key) { [...] } return this.dataValues; }
cloneDeep()
只是复制事物,在这里没关系。
重要的是上面的return this.dataValues;
。那条线剥去了您在控制台中看到的对象,并导致仅序列化其dataValues
字段。
小型演示:
var data1={
dataValues:{id:1},
somethingElse:[1,2,3],
_stuff:{a:'b'}
};
var data2={
dataValues:{id:1},
somethingElse:[1,2,3],
_stuff:{a:'b'},
toJSON:function(){return this.dataValues;}
};
console.log("data1:",JSON.stringify(data1));
console.log("data2:",JSON.stringify(data2));
答案 1 :(得分:-1)
JSON.stringify()
返回其输入的JSON安全字符串表示形式(例如JS对象)。它将删除所有没有等效JSON表示形式的属性/字段。
而console.log()
将JS对象直接输出到控制台。