JSON.stringify 在属性上不带引号?局限性
2022-08-30 04:33:37
我使用的是使用不正确的JSON格式的服务(属性两边没有双引号)。所以我需要发送
{ name: "John Smith" }
而不是{ "name": "John Smith" }
此格式无法更改,因为这不是我的服务。
有人知道像上面这样的字符串化路由来格式化JavaScript对象吗?
我使用的是使用不正确的JSON格式的服务(属性两边没有双引号)。所以我需要发送
{ name: "John Smith" }
而不是{ "name": "John Smith" }
此格式无法更改,因为这不是我的服务。
有人知道像上面这样的字符串化路由来格式化JavaScript对象吗?
在大多数情况下,这个简单的正则表达式解决方案可以取消引用 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}}`;
}
看起来这是您要查找的简单对象到字符串方法。
在 Node.js通过使用 util 对象并调用 util.inspect(yourObject)来解决此问题。这将为您提供您想要的一切。点击此链接查看更多选项,包括方法应用的深度。http://nodejs.org/api/util.html#util_util_inspect_object_options
因此,您正在寻找的基本上是对象检查器,而不是JSON转换器。JSON 格式指定所有属性必须用双引号引起来。因此,不会有JSON转换器来做你想要的事情,因为这根本不是JSON格式。这里的规格: https://developer.mozilla.org/en-US/docs/Using_native_JSON
字符串或检查的对象是您需要的,具体取决于服务器的语言。