JSON.stringify在属性上没有引号?
https://qastack.cn/programming/11233498/json-stringify-without-quotes-on-properties
JSON.stringify在属性上没有引号?
95
我正在使用使用不正确的JSON格式的服务(属性周围没有双引号)。所以我需要发送
{ name: "John Smith" }
代替 { "name": "John Smith" }
无法更改此格式,因为这不是我的服务。
有谁知道像上面这样格式化JavaScript对象的字符串化路由?
Answers:
115
在大多数情况下,此简单的正则表达式解决方案可取消对JSON属性名称的引用:
const object = { name: 'John Smith' };
const json = JSON.stringify(object); // {"name":"John Smith"}
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted); // {name:"John Smith"}
运行代码段
展开摘要
极端情况:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
特别感谢Rob W修复了它。
局限性
在正常情况下,上述正则表达式可以正常工作,但是从数学上讲,不可能用正则表达式来描述JSON格式,以使其在每种情况下都可以工作(对于正则表达式,计数相同数量的花括号是不可能的。)通过本地函数正式解析JSON字符串并重新序列化,创建一个新的函数以删除引号:
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
// not an object, stringify using native function
return JSON.stringify(obj_from_json);
}
// Implements recursive object serialization according to JSON spec
// but without quotes around the keys.
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}