Esta solução simples de expressão regular funciona para remover aspas nomes de propriedades JSON na maioria dos 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" }'
Agradecimentos especiais a Rob W por consertá-lo.
Limitações
Em casos normais, a expressão regular mencionada funcionará, mas matematicamente é impossível descrever o formato JSON com uma expressão regular de forma que funcione em todos os casos (contar o mesmo número de chaves é impossível com a expressão regular.) Portanto, eu tenho crie uma nova função para remover aspas, analisando formalmente a string JSON por meio da função nativa e reerialize-a:
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}}`;
}
Exemplo: https://jsfiddle.net/DerekL/mssybp3k/
{"foo":"e\":bar"}
(JSON válido) torna-se{foo:e:bar"}
(...)!/\\\"/
pode ser simplificado para/\\"/
. Não se esqueça de adicionar o sinalizador global/\\"/g
, ou ele quebrará em strings com vários\"
. Já para o caractere aleatório, nunca use um literal U + FFFF, caso o editor engasgue, mas sim uma seqüência de escape. A regex para reversão se tornaria/\uFFFF/g
./\"([^(\")"]+)\":/g
pode ser simplificada/"([^"]+)":/g
, consulte regex101.com/r/qnz0ld/2Parece que este é um método Object toString simples que você está procurando.
No Node.js, isso é resolvido usando o objeto util e chamando util.inspect (yourObject). Isso lhe dará tudo o que você deseja. siga este link para mais opções, incluindo a profundidade da aplicação do método. http://nodejs.org/api/util.html#util_util_inspect_object_options
Portanto, o que você está procurando é basicamente um inspetor de objetos, não um conversor JSON. O formato JSON especifica que todas as propriedades devem ser colocadas entre aspas duplas. Portanto, não haverá conversores JSON para fazer o que você deseja, pois simplesmente não é um formato JSON. Especifique aqui: https://developer.mozilla.org/en-US/docs/Using_native_JSON
Objeto para string ou inspeção é o que você precisa, dependendo do idioma do seu servidor.
fonte
.toSource()
funciona bem com nodejs também, mas não funciona com objetos em arrays. Autil
inspeção funciona para arrays e objetos em arrays, o que é maravilhoso, adorei.util.inspect()
funcionou muito bem para mim ao escrever um objeto em uma consulta Neo4j, para definir vários parâmetros de uma vez.Você pode olhar o código-fonte de um analisador criado por aquele que definiu o formato JSON . Procure chamadas de função: elas cercam um valor entre aspas. As chaves são citadas nas linhas 326 e 338 .
json2.js
quote
Não inclua a biblioteca após a modificação. Em vez disso, pegue apenas a parte relevante (
stringify
) ou pelo menos substituaJSON
por outra coisa, por exemplo.FAKEJSON
.Por exemplo, um objeto
FAKEJSON
que definiu apenasstringify
: http://jsfiddle.net/PYudw/fonte
JSON.stringify
parte e remova as aspas. Como a biblioteca é criada por quem definiu JSON , podemos ter certeza de que o resultado é um JSON muito válido..toSource()
funciona bem, mas não inclui se o seu objeto está no array, o que é uma chatice (e eu estou no nó, então a compatibilidade do navegador não é um problema: P) então vou usar este método obrigado @RobW também, o link jsfiddle parece ficar preso na página de carregamento :(Tente usar o servive com JSONP, acho que eles oferecem ao usar este formato.
Caso contrário, envie-lhes um relatório de bug detalhado, incluindo uma boa argumentação sobre porque o deve estar em conformidade com o padrão. Qualquer outra solução além de eliminar o problema de origem não é uma solução real.
Uma solução rápida e suja pode ser canalizar a string por meio de uma regex antes de analisá-la:
Ou tente ajustar um analisador JSON javascript existente (como este ) se quiser uma análise mais sintática.
fonte
Encontre um bom pacote de NPM para fazer exatamente isso:
https://www.npmjs.com/package/stringify-object
Funciona muito bem.
fonte
Sua sintaxe herdada deve ser facilmente comida por YAML, que é um superconjunto de JSON.
Experimente o analisador e dumper JavaScript YAML: http://nodeca.github.com/js-yaml/
fonte
@Derek 朕 會 功夫 Obrigado por compartilhar este método, gostaria de compartilhar meu código, que suporta a stringificação de um array de objetos também.
fonte
JSON.stringify
por exemplo Data também. Também retorna'null'
seobj_from_json
for nulo.if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
Usar
JSON5.stringify
JSON5 é um superconjunto de JSON que permite a sintaxe ES5, incluindo chaves de propriedade não citadas . A implementação de referência JSON5 (
json5
pacote npm ) fornece umJSON5
objeto que tem os mesmos métodos com os mesmos argumentos e semânticas doJSON
objeto integrado .É muito provável que o serviço que você está usando esteja usando esta biblioteca.
fonte
O JSON Beautifier do CSVJSON tem a opção de inserir cotações nas chaves. Se você quiser apenas o código, poderá copiá-lo do repositório GitHub. I modificado JSON2 de Douglas Crockford para adicionar suporte para isso.
fonte
hacked by AnoaGhost