Solusi ekspresi reguler sederhana ini berfungsi untuk menghapus kutipan nama properti JSON dalam banyak kasus:
const object = { name: 'John Smith' };
const json = JSON.stringify(object);
console.log(json);
const unquoted = json.replace(/"([^"]+)":/g, '$1:');
console.log(unquoted);
Kasus ekstrim:
var json = '{ "name": "J\\":ohn Smith" }'
json.replace(/\\"/g,"\uFFFF");
json = json.replace(/"([^"]+)":/g, '$1:').replace(/\uFFFF/g, '\\\"');
Terima kasih khusus kepada Rob W untuk memperbaikinya.
Batasan
Dalam kasus normal, regexp yang disebutkan di atas akan berfungsi, tetapi secara matematis tidak mungkin untuk menggambarkan format JSON dengan ekspresi reguler sedemikian rupa sehingga akan berfungsi di setiap kasus (menghitung jumlah tanda kurung keriting yang sama tidak mungkin dengan regexp.) Oleh karena itu, saya punya buat fungsi baru untuk menghapus tanda kutip dengan mengurai string JSON secara resmi melalui fungsi asli dan melakukan reserialisasi:
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}}`;
}
Contoh: https://jsfiddle.net/DerekL/mssybp3k/
{"foo":"e\":bar"}
(JSON valid) menjadi{foo:e:bar"}
(...)!/\\\"/
dapat disederhanakan menjadi/\\"/
. Jangan lupa untuk menambahkan bendera global/\\"/g
, atau akan merusak string dengan beberapa\"
. Sedangkan untuk karakter acak, jangan pernah menggunakan U + FFFF literal, jika editor tersedak, tetapi escape sequence. Regex untuk mengembalikan akan menjadi/\uFFFF/g
./\"([^(\")"]+)\":/g
dapat disederhanakan/"([^"]+)":/g
, lihat regex101.com/r/qnz0ld/2Sepertinya ini adalah metode Object toString sederhana yang Anda cari.
Di Node.js, hal ini diselesaikan dengan menggunakan objek util dan memanggil util.inspect (yourObject). Ini akan memberikan semua yang Anda inginkan. ikuti tautan ini untuk opsi lainnya termasuk kedalaman penerapan metode. http://nodejs.org/api/util.html#util_util_inspect_object_options
Jadi, yang Anda cari pada dasarnya adalah pemeriksa objek, bukan konverter JSON. Format JSON menentukan bahwa semua properti harus diapit tanda kutip ganda. Karenanya tidak akan ada konverter JSON untuk melakukan apa yang Anda inginkan karena itu bukan format JSON. Spek di sini: https://developer.mozilla.org/en-US/docs/Using_native_JSON
Objek ke string atau inspeksi adalah apa yang Anda butuhkan tergantung pada bahasa server Anda.
sumber
.toSource()
berfungsi dengan baik di dalam nodejs juga, tetapi tidak berfungsi objek dalam array. Theutil
memeriksa bekerja untuk array dan objek dalam array yang indah, cinta itu.util.inspect()
bekerja luar biasa bagi saya saat menulis objek ke kueri Neo4j, untuk menyetel beberapa parameter sekaligus.Anda dapat melihat kode sumber parser yang dibuat oleh orang yang mendefinisikan format JSON . Cari panggilan fungsi: panggilan ini mengelilingi nilai dengan tanda kutip. Kunci dikutip pada baris 326 dan 338
json2.js
quote
.Jangan menyertakan pustaka setelah modifikasi. Alih-alih hanya mengambil bagian yang relevan (
stringify
), atau setidaknya menggantiJSON
dengan yang lain, mis.FAKEJSON
.Misalnya, objek
FAKEJSON
yang hanya didefinisikanstringify
: http://jsfiddle.net/PYudw/sumber
JSON.stringify
bagiannya, dan hapus tanda kutipnya. Karena pustaka dibuat oleh orang yang mendefinisikan JSON , kita bisa yakin bahwa hasilnya adalah JSON yang sangat valid..toSource()
berfungsi dengan baik tetapi tidak termasuk jika objek Anda dalam array yang mengecewakan (dan saya berada di node sehingga compat browser tidak menjadi masalah: P) jadi saya akan menggunakan metode ini terima kasih @RobW juga, tautan jsfiddle tampaknya macet di laman pemuatan :(Coba gunakan servive dengan JSONP, saya kira mereka menawarkannya saat menggunakan format ini.
Lain, ajukan mereka laporan bug rinci termasuk argumentasi yang baik mengapa harus sesuai dengan standar. Solusi lain selain menghilangkan masalah sumber bukanlah solusi nyata.
Perbaikan cepat-n-kotor mungkin dengan menyalurkan string melalui regex sebelum menguraikannya:
var obj = JSON.parse(str.replace(/(\{|,)\s*(.+?)\s*:/g, '$1 "$2":'));
Atau Anda mencoba menyesuaikan parser JSON javascript yang ada (seperti ini ) jika Anda menginginkan parse yang lebih sintaksis.
sumber
Menemukan paket NPM yang bagus untuk melakukan ini:
https://www.npmjs.com/package/stringify-object
const stringify = require('stringify-object') let prettyOutput = stringify(json);
Bekerja dengan baik.
sumber
Sintaks warisan Anda harus mudah dimakan oleh YAML, yang merupakan superset dari JSON.
Coba parser dan dumper YAML JavaScript: http://nodeca.github.com/js-yaml/
sumber
@Derek 朕 會 功夫 Terima kasih telah membagikan metode ini, saya ingin membagikan kode saya yang mendukung merangkai array objek juga.
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(",") }}`; };
sumber
JSON.stringify
misalnya Tanggal juga. Juga kembalikan'null'
jikaobj_from_json
nol.if(typeof obj_from_json !== "object" || obj_from_json instanceof Date || obj_from_json === null)
Menggunakan
JSON5.stringify
JSON5 adalah superset dari JSON yang memungkinkan sintaks ES5, termasuk kunci properti tanpa tanda kutip . Implementasi referensi JSON5 (
json5
paket npm ) menyediakanJSON5
objek yang memiliki metode yang sama dengan arg dan semantik yang sama seperti bawaanJSON
objek .Sangat mungkin bahwa layanan yang Anda gunakan menggunakan pustaka ini.
sumber
JSON Beautifier CSVJSON memiliki opsi untuk memberikan tanda kutip pada kunci. Jika Anda hanya menginginkan kodenya, Anda dapat menyalinnya dari repo GitHub. Saya memodifikasi JSON2 Douglas Crockford untuk menambahkan dukungan untuk itu.
sumber
hacked by AnoaGhost