Esta sencilla solución de expresión regular funciona para eliminar las comillas de los nombres de propiedad JSON en la mayoría de los casos:
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"}
Caso extremo:
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 agradecimiento especial a Rob W por arreglarlo.
Limitaciones
En casos normales, la expresión regular antes mencionada funcionará, pero matemáticamente es imposible describir el formato JSON con una expresión regular de modo que funcione en todos los casos (contar el mismo número de llaves es imposible con expresiones regulares). Por lo tanto, tengo cree una nueva función para eliminar comillas analizando formalmente la cadena JSON a través de la función nativa y reserialícela:
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}}`;
}
Ejemplo: https://jsfiddle.net/DerekL/mssybp3k/