To proste rozwiązanie wyrażenia regularnego działa w większości przypadków w celu usunięcia cudzysłowu nazw właściwości JSON:
const object = { name: 'John Smith' };
const json = JSON.stringify(object);
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted);
Ekstremalna sprawa:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF");
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
Specjalne podziękowania dla Roba W. za naprawienie tego.
Ograniczenia
W normalnych przypadkach powyższe wyrażenie regularne będzie działać, ale matematycznie niemożliwe jest opisanie formatu JSON wyrażeniem regularnym w taki sposób, aby działał w każdym pojedynczym przypadku (policzenie tej samej liczby nawiasów klamrowych jest niemożliwe w przypadku wyrażenia regularnego). Dlatego mam utwórz nową funkcję, aby usunąć cudzysłowy, formalnie analizując ciąg JSON za pomocą funkcji natywnej i ponownie go zerializuj:
function stringify(obj_from_json) {
if (typeof obj_from_json !== "object" || Array.isArray(obj_from_json)){
return JSON.stringify(obj_from_json);
}
let props = Object
.keys(obj_from_json)
.map(key => `${key}:${stringify(obj_from_json[key])}`)
.join(",");
return `{${props}}`;
}
Przykład: https://jsfiddle.net/DerekL/mssybp3k/
{"foo":"e\":bar"}
(prawidłowy JSON) staje się{foo:e:bar"}
(...)!/\\\"/
można uprościć do/\\"/
. Nie zapomnij dodać flagi globalnej/\\"/g
, w przeciwnym razie zepsuje się na łańcuchach z wieloma\"
. Jeśli chodzi o znak losowy, nigdy nie używaj literału U + FFFF, na wypadek gdyby edytor się dławi, ale sekwencji ucieczki. Wyrażenie regularne do przywracania to/\uFFFF/g
./\"([^(\")"]+)\":/g
można uprościć do/"([^"]+)":/g
, patrz regex101.com/r/qnz0ld/2Wygląda na to, że jest to prosta metoda Object toString, której szukasz.
W Node.js jest to rozwiązane poprzez użycie obiektu util i wywołanie util.inspect (yourObject). To da ci wszystko, czego chcesz. kliknij ten link, aby uzyskać więcej opcji, w tym głębokość zastosowania metody. http://nodejs.org/api/util.html#util_util_inspect_object_options
Więc to, czego szukasz, to w zasadzie inspektor obiektów, a nie konwerter JSON. Format JSON określa, że wszystkie właściwości muszą być ujęte w podwójne cudzysłowy. W związku z tym nie będzie konwerterów JSON do robienia tego, co chcesz, ponieważ po prostu nie jest to format JSON.Specs tutaj: https://developer.mozilla.org/en-US/docs/Using_native_JSON
W zależności od języka twojego serwera potrzebujesz sprzeciwu do łańcucha lub inspekcji.
źródło
.toSource()
działa dobrze również w nodejs, ale nie działa z obiektami w tablicach.util
Sprawdzać prace dla tablic i obiektów w tablicach, które jest wspaniałe, uwielbiam go.util.inspect()
po prostu zadziałało wspaniale podczas pisania obiektu do zapytania Neo4j, aby ustawić wiele parametrów jednocześnie.Możesz spojrzeć na kod źródłowy parsera utworzony przez tego, który zdefiniował format JSON . Poszukaj wywołań funkcji: otaczają one wartość cudzysłowami. Klucze są cytowane w wierszach 326 i 338 .
json2.js
quote
Nie dołączaj biblioteki po modyfikacji. Zamiast tego weź tylko odpowiednią (
stringify
) część lub przynajmniej zamień naJSON
coś innego, np.FAKEJSON
.Na przykład obiekt,
FAKEJSON
który definiuje tylkostringify
: http://jsfiddle.net/PYudw/źródło
JSON.stringify
udział i usuń cytaty. Ponieważ biblioteka jest tworzona przez osobę, która zdefiniowała JSON , możemy być prawie pewni, że wynikiem jest bardzo poprawny JSON..toSource()
działa dobrze, ale nie obejmuje, jeśli twój obiekt jest w tablicy, co jest bummer (i jestem w węźle, więc kompatybilność przeglądarki nie jest problemem: P), więc użyję tej metody dzięki @RobW również, wydaje się, że link jsfiddle utknąć na stronie ładowania :(Spróbuj użyć servive'a z JSONP, myślę, że oferują go przy używaniu tego formatu.
W przeciwnym razie prześlij im szczegółowy raport o błędzie zawierający dobrą argumentację, dlaczego powinien być zgodny ze standardem. Żadne inne rozwiązanie niż wyeliminowanie problemu źródłowego nie jest prawdziwym rozwiązaniem.
Szybką naprawą może być przepuszczenie ciągu przez wyrażenie regularne przed jego przetworzeniem:
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
Lub spróbuj dostosować istniejący parser JSON javascript (taki jak ten ), jeśli chcesz uzyskać bardziej składniową analizę.
źródło
Znalazłem dobry pakiet NPM, który wystarczy do tego:
https://www.npmjs.com/package/stringify-object
const stringify = require('stringify-object') let prettyOutput = stringify(json);
Działa całkiem dobrze.
źródło
Twoja odziedziczona składnia powinna być łatwo zjadana przez YAML, który jest nadzbiorem JSON.
Wypróbuj parser JavaScript YAML i program dumper: http://nodeca.github.com/js-yaml/
źródło
@Derek 朕 會 功夫 Dzięki za udostępnienie tej metody, chciałbym udostępnić mój kod, który obsługuje również tworzenie ciągów znaków w tablicy obiektów.
export const stringifyObjectWithNoQuotesOnKeys = (obj_from_json) => { // In case of an array we'll stringify all objects. if (Array.isArray(obj_from_json)) { return `[${ obj_from_json .map(obj => `${stringifyObjectWithNoQuotesOnKeys(obj)}`) .join(",") }]` ; } // not an object, stringify using native function if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null){ return JSON.stringify(obj_from_json); } // Implements recursive object serialization according to JSON spec // but without quotes around the keys. return `{${ Object .keys(obj_from_json) .map(key => `${key}:${stringifyObjectWithNoQuotesOnKeys(obj_from_json[key])}`) .join(",") }}`; };
źródło
JSON.stringify
na przykład Date. Zwróć także,'null'
jeśliobj_from_json
jest null.if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
Posługiwać się
JSON5.stringify
JSON5 jest rozszerzeniem JSON, który pozwala ES5 składni, w tym notowanych kluczy własności. Implementacja referencyjna JSON5 (
json5
pakiet npm ) udostępniaJSON5
obiekt, który ma te same metody z tymi samymi argumentami i semantyką co wbudowanyJSON
obiekt.Jest wysoce prawdopodobne, że usługa, z której korzystasz, korzysta z tej biblioteki.
źródło
JSON Beautifier CSVJSON ma opcję umieszczania cudzysłowów na klawiszach. Jeśli chcesz tylko kod, możesz skopiować go z repozytorium GitHub. I zmodyfikowane Douglasa Crockforda za JSON2 dodać obsługę tego.
źródło
hacked by AnoaGhost