Cette solution d'expression régulière simple fonctionne pour décompresser les noms de propriété JSON dans la plupart des cas:
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"}
Cas extrême:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF"); // U+ FFFF
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
// '{ name: "J\":ohn Smith" }'
Un merci spécial à Rob W pour l'avoir réparé.
Limites
Dans des cas normaux, l'expression rationnelle susmentionnée fonctionnera, mais mathématiquement, il est impossible de décrire le format JSON avec une expression régulière telle qu'elle fonctionnera dans tous les cas (compter le même nombre d'accolades est impossible avec l'expression rationnelle). Par conséquent, j'ai créer une nouvelle fonction pour supprimer les guillemets en analysant formellement la chaîne JSON via la fonction native et la resérialiser:
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}}`;
}
Exemple: https://jsfiddle.net/DerekL/mssybp3k/