我手头上有以下问题: 如果我尝试使用以下样式将 json 发送到 api,它可以正常工作:
{ "key": "value", "key": value }
如果我使用以下格式,你似乎总是用JavaScript得到它不起作用:
{ key: "value", key: value }
JSON.stringify 也不起作用,因为它似乎需要一个对象而不是字符串
JSON 语法非常有限,尽管非常有用。
当然,根据后端的 JSON 解析器,它可以允许使用不带双引号的键,但这将是所述解析器的奇怪行为......对于浏览器
JSON
api 那么你需要保持常规规则(包括双引号键)。
在浏览器级别,您可以使用
JSON.stringify()
将几乎任何实例转换为有效的 JSON 字符串。包括文字。 JSON.parse()
将需要一个有效的 JSON 字符串作为参数,如果该字符串不是有效的 JSON,则计算结果为空值。
const literalString = "my literal string";
const literalNumber = Date.now();
const literalObject = { literalString, literalNumber };
// EXAMPLE 1
const example1 = JSON.stringify(literalString);
// Example 2
const example2 = JSON.stringify(literalNumber);
// Example 3
const example3 = JSON.stringify(literalObject);
// Example 4
const example4 = JSON.stringify(true);
// Example 5 // Invalid use
const example5 = JSON.stringify(class Something {});
console.log
({
example1, example2, example3, example4, example5,
});
console.log('Parsed Values:');
console.log
({
example1: example1 ? JSON.parse(example1) : undefined,
example2: example2 ? JSON.parse(example2) : undefined,
example3: example3 ? JSON.parse(example3) : undefined,
example4: example4 ? JSON.parse(example4) : undefined,
example5: example5 ? JSON.parse(example5) : undefined,
});
addEventListener
(
'error', errorEvent => console.warn(errorEvent.error.message)
);
console.log('Additional Test:');
console.log(JSON.parse("{key: \"Value\"}"));
.as-console-wrapper { min-height: 100%; }
注意:仍然有一些
JSON.stringify
/JSON.parse
无法识别的文字,例如 BigInt
、类、函数以及可能更多...但几乎一切都会正常工作。
编辑:
JSON.stringify()
接受任何实例(即使它们是内置的)并使用它的可枚举属性来创建该对象的 JSON 版本。碰巧的是,内置构造函数中的大多数实例都没有可枚举的属性,从而导致空对象。
以下是其他示例(包括内置示例):
const instance =
{
get getter ()
{
return 'string';
},
// ignored by JSON.stringify()
method ()
{
return 10;
},
property: 'value',
// ignored by JSON.stringify()
function: function someFunction ()
{
return 20;
}
};
// ignored by JSON.stringify()
const commonArrow = () => {};
// ignored by JSON.stringify()
const commonClass = class { enumerable = 'value'; };
const commonDate = new Date;
const commonError = new Error('some text');
// ignored by JSON.stringify()
const commonFunction = function ()
{
return 30;
};
const commonObject = new commonClass;
const commonMap = new Map;
const commonSet = new Set;
commonMap.set(commonObject, commonSet);
commonSet.add(commonObject);
addEventListener('error', errorEvent => console.warn(errorEvent.error));
[
instance,
commonArrow, commonClass, commonDate, commonError,
commonFunction, commonObject, commonMap, commonSet,
]
.forEach
(
item =>
{
// Setting an enumerable property to each item.
item.enumerableProperty = 'value';
const type = item?.name ?? ( item?.constructor?.name + ' instance' ) ?? typeof item;
try
{
console.log((type + ' (enumerables):'), JSON.stringify(item));
console.log((type + ' (all properties):'), JSON.stringify(item, allKeys(item)));
}
catch ( error )
{
console.warn((type + ':'), error.message);
}
}
);
function allKeys ( subject )
{
const keys = [];
let current = subject;
while ( current != null )
{
keys.push(...Reflect.ownKeys(current));
current = Object.getPrototypeOf(current);
}
return keys;
}
.as-console-wrapper { min-height: 100%; }
请参阅 文档,了解有关 JSON 如何解析值的更多详细信息(包括神奇的
.toJSON()
方法)。