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/
{"foo":"e\":bar"}
(JSON válido) se convierte en{foo:e:bar"}
(...)!/\\\"/
se puede simplificar a/\\"/
. No olvide agregar la bandera global/\\"/g
, o se romperá en cadenas con múltiples\"
. En cuanto al carácter aleatorio, nunca use un U + FFFF literal, en caso de que el editor se ahogue, sino una secuencia de escape. La expresión regular para revertir se convertiría en/\uFFFF/g
./\"([^(\")"]+)\":/g
se puede simplificar/"([^"]+)":/g
, consulte regex101.com/r/qnz0ld/2Parece que este es un método simple de Object toString que está buscando.
En Node.js, esto se resuelve usando el objeto util y llamando a util.inspect (yourObject). Esto te dará todo lo que quieras. siga este enlace para obtener más opciones, incluida la profundidad de la aplicación del método. http://nodejs.org/api/util.html#util_util_inspect_object_options
Entonces, lo que está buscando es básicamente un inspector de objetos, no un convertidor JSON. El formato JSON especifica que todas las propiedades deben ir entre comillas dobles. Por lo tanto, no habrá convertidores JSON para hacer lo que desea, ya que simplemente no es un formato JSON. Especificaciones aquí: https://developer.mozilla.org/en-US/docs/Using_native_JSON
Objeto a la cadena o inspección es lo que necesita dependiendo del idioma de su servidor.
fuente
.toSource()
funciona bien dentro de nodejs, pero no funciona con objetos en matrices. Lautil
inspección funciona para matrices y objetos en matrices, lo cual es maravilloso, me encanta.util.inspect()
Me funcionó de maravilla al escribir un objeto en una consulta de Neo4j, para establecer varios parámetros a la vez.Puede ver el código fuente de un analizador creado por el que definió el formato JSON . Busque llamadas a funciones: estas rodean un valor entre comillas. Las claves se cotizan en las líneas 326 y 338 .
json2.js
quote
No incluya la biblioteca después de la modificación. En su lugar, solo tome la parte relevante (
stringify
), o al menos reemplácelaJSON
con otra cosa, por ejemplo.FAKEJSON
.Por ejemplo, un objeto
FAKEJSON
que solo definestringify
: http://jsfiddle.net/PYudw/fuente
JSON.stringify
parte y elimina las comillas. Dado que la biblioteca es creada por quien definió JSON , podemos estar bastante seguros de que el resultado es un JSON muy válido..toSource()
funciona bien pero no incluye si su objeto está en la matriz, lo cual es un fastidio (y estoy en el nodo, por lo que la compatibilidad del navegador no es un problema: P), así que usaré este método gracias @RobW también, el enlace jsfiddle parece estar atascado en la página de carga :(Intenta usar el servive con JSONP, supongo que lo ofrecen cuando usan este formato.
De lo contrario, envíeles un informe de error detallado que incluya una buena argumentación de por qué deben cumplir con el estándar. Cualquier otra solución que no sea eliminar el problema de origen no es una solución real.
Una solución rápida y sucia podría ser canalizar la cadena a través de una expresión regular antes de analizarla:
O intenta ajustar un analizador JSON de JavaScript existente (como este ) si desea un análisis más sintáctico.
fuente
Encontré un buen paquete de NPM para hacer precisamente esto:
https://www.npmjs.com/package/stringify-object
Funciona bastante bien.
fuente
YAML, que es un superconjunto de JSON, debería asimilar fácilmente la sintaxis heredada.
Pruebe el analizador y volcador YAML de JavaScript: http://nodeca.github.com/js-yaml/
fuente
@Derek 朕 會 功夫 Gracias por compartir este método, me gustaría compartir mi código que también admite la secuenciación de una matriz de objetos.
fuente
JSON.stringify
por ejemplo, Date. También devuelve'null'
siobj_from_json
es nulo.if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
Utilizar
JSON5.stringify
JSON5 es un superconjunto de JSON que permite la sintaxis de ES5, incluidas las claves de propiedad sin comillas . La implementación de referencia JSON5 (
json5
paquete npm ) proporciona unJSON5
objeto que tiene los mismos métodos con los mismos argumentos y semántica que elJSON
objeto integrado .Es muy probable que el servicio que está utilizando utilice esta biblioteca.
fuente
JSON Beautifier de CSVJSON tiene una opción para colocar comillas en las claves. Si solo desea el código, puede copiarlo desde el repositorio de GitHub. Yo modifiqué JSON2 de Douglas Crockford para añadir soporte para eso.
fuente
hacked by AnoaGhost