Giải pháp biểu thức chính quy đơn giản này hoạt động để hủy trích dẫn tên thuộc tính JSON trong hầu hết các trường hợp:
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"}
Trường hợp cực đoan:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
Đặc biệt cảm ơn Rob W vì đã sửa nó.
Hạn chế
Trong các trường hợp bình thường, regexp nói trên sẽ hoạt động, nhưng về mặt toán học không thể mô tả định dạng JSON bằng một biểu thức chính quy để nó hoạt động trong mọi trường hợp (đếm cùng một số dấu ngoặc nhọn là không thể với regexp.) Do đó, tôi có tạo một hàm mới để xóa dấu ngoặc kép bằng cách phân tích cú pháp chính thức chuỗi JSON thông qua hàm gốc và sắp xếp lại nó:
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}}`;
}
Ví dụ: https://jsfiddle.net/DerekL/mssybp3k/