在执行JSON.stringify(hash)时如何保留未定义的值?
这是一个例子:
var hash = {
"name" : "boda",
"email" : undefined,
"country" : "africa"
};
var string = JSON.stringify(hash);
> "{"name":"boda","country":"africa"}"
电子邮件从JSON.stringify中消失了。
在执行JSON.stringify(hash)时如何保留未定义的值?
这是一个例子:
var hash = {
"name" : "boda",
"email" : undefined,
"country" : "africa"
};
var string = JSON.stringify(hash);
> "{"name":"boda","country":"africa"}"
电子邮件从JSON.stringify中消失了。
"undefined"
或者也许是null
一个空字符串""
。您会如何选择它?
{ name:"boda", email:undefined, country:"africa" }
Answers:
您可以传递一个replacer函数来JSON.stringify
自动将undefined
值转换为null
值,如下所示:
var string = JSON.stringify(
obj,
function(k, v) { return v === undefined ? null : v; }
);
这也适用于数组内的未定义值,因为JSON.stringify
已经将它们转换为null
。
JSON.stringify(obj, (k, v) => v === undefined ? null : v)
null
值,undefined
JSON标准中未定义任何值。
return typeof v === 'function' ? 'func' : v;
这应该可以解决问题
// Since 'JSON.stringify' hides 'undefined', the code bellow is necessary in
// order to display the real param that have invoked the error.
JSON.stringify(hash, (k, v) => (v === undefined) ? '__undefined' : v)
.replace('"__undefined"', 'undefined')
function stringifyWithUndefined(obj, space) {
const str = JSON.stringify(obj, (key, value) => value === undefined ? '__undefined__' : value, space);
return str.replace(/"__undefined__"/g, 'undefined');
}
例:
const obj = {
name: 'boda',
email: undefined,
country: 'africa'
};
console.log(stringifyWithUndefined(obj, 2));
结果:
{
"name": "boda",
"email": undefined,
"country": "africa"
}
NaN
除了undefined
为好。如果将来有其他人这样做:function customStringify(o) { return JSON.stringify(o, (k, v) => v === undefined ? '__undefined__' : v !== v ? '__NaN__' : v).replace(/"__undefined__"/g, 'undefined').replace(/"__NaN__"/g, 'NaN'); }
我在这里读到两行之间,并猜测您想要在使用JSON.parse时具有未定义的值吗?
如果是这样,您可以使用以下方法:
var encodeUndefined = function(obj, undefinedPaths, path) {
path = path || 'ROOT';
for (var key in obj) {
var keyPath = path + '.' + key;
var value = obj[key];
if (value === undefined) {
undefinedPaths.push(keyPath);
} else if (typeof value == "object" && value !== null) {
encodeUndefined(obj[key], undefinedPaths, keyPath);
}
}
}
var stringifyAndPreserveUndefined = function(obj) {
var undefinedPaths = [];
//save all paths that have are undefined in a array.
encodeUndefined((obj), undefinedPaths);
return JSON.stringify({
ROOT: obj,
undefinedPaths: undefinedPaths
}, function(k, v) { if (v === undefined) { return null; } return v; });
}
var parseAndRestoreUndefined = function(value) {
var data = JSON.parse(value);
var undefinedPaths = data.undefinedPaths;
var obj = data.ROOT;
//Restore all undefined values
for (var pathIndex = 0; pathIndex < undefinedPaths.length; pathIndex++) {
var pathParts = undefinedPaths[pathIndex].substring(5).split('.');
var item = obj;
for (var pathPartIndex = 0; pathPartIndex < pathParts.length - 1; pathPartIndex++) {
item = item[pathParts[pathPartIndex]];
}
item[pathParts[pathParts.length - 1]] = undefined;
}
return obj;
}
var input = {
test1: 'a',
test2: 'b',
test3: undefined,
test4: {
test1: 'a',
test2: undefined
}
};
var result = stringifyAndPreserveUndefined(input);
var result2 = parseAndRestoreUndefined(result);
stringifyAndPreserveUndefined
将所有未定义的值编码在数组中,当您调用parseAndRestoreUndefined
它时,会将它们再次放置在正确的位置。
不利的一面是json看起来不会完全像对象。在上面的示例中,它将变成{"ROOT":{"test1":"a","test2":"b","test4":{"test1":"a"}},"undefinedPaths":["ROOT.test3","ROOT.test4.test2"]}
undefined
)
这将导致它打印为,undefined
但这是INVALID json,但是是有效的JavaScript。
var string = JSON.stringify(obj, function(k,v){return v===undefined?"::undefined::":v}, 2).replace(new RegExp("\"::undefined::\"", 'g'), "undefined");