Це просте рішення регулярних виразів працює, щоб у більшості випадків зняти назви властивостей 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" }'
Особлива подяка Робу В. за виправлення.
Обмеження
У звичайних випадках вищезазначений регулярний вираз буде працювати, але математично неможливо описати формат 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}}`;
}
Приклад: https://jsfiddle.net/DerekL/mssybp3k/