Bagaimana saya harus mengurai JSON menggunakan Node.js? Apakah ada beberapa modul yang akan memvalidasi dan mem-parsing JSON dengan aman?
javascript
json
node.js
Tikhon Jelvis
sumber
sumber
Anda dapat meminta file .json.
Sebagai contoh jika Anda memiliki
config.json
file dalam direktori yang sama dengan file kode sumber Anda, Anda akan menggunakan:atau (ekstensi file dapat dihilangkan):
Catatan bahwa
require
ini sinkron dan hanya membaca file sekali , panggilan berikut mengembalikan hasil dari cachePerhatikan juga Anda hanya boleh menggunakan ini untuk file lokal di bawah kendali absolut Anda, karena berpotensi mengeksekusi kode apa pun di dalam file.
sumber
require
itu sinkron. Jika Anda ingin menggunakan ramah asyncfs.readFile
sebagai gantinya denganJSON.parse
.json
ekstensi! Jika file Anda TIDAK memiliki.json
ekstensi, mengharuskan tidak akan memperlakukannya sebagai file json.Anda bisa menggunakannya
JSON.parse()
.Anda harus dapat menggunakan
JSON
objek pada implementasi JavaScript yang kompatibel dengan ECMAScript 5 . Dan V8 , di mana Node.js dibangun adalah salah satunya.Parsing string yang berisi data JSON
Parsing file yang berisi data JSON
Anda harus melakukan beberapa operasi file dengan
fs
modul.Versi asinkron
Versi sinkron
Anda ingin menggunakannya
require
? Pikirkan lagi!Anda terkadang dapat menggunakan
require
:Tapi, saya tidak merekomendasikan ini karena beberapa alasan:
require
sinkron. Jika Anda memiliki file JSON yang sangat besar, itu akan mencekik loop acara Anda. Anda benar-benar perlu menggunakanJSON.parse
denganfs.readFile
.require
akan membaca file hanya sekali . Panggilan selanjutnya kerequire
file yang sama akan mengembalikan salinan yang di-cache. Bukan ide yang baik jika Anda ingin membaca.json
file yang terus diperbarui. Anda bisa menggunakan retasan . Tetapi pada titik ini, lebih mudah digunakanfs
..json
ekstensi,require
tidak akan memperlakukan konten file sebagai JSON.Serius! Gunakan
JSON.parse
.load-json-file
modulJika Anda membaca banyak
.json
file, (dan jika Anda sangat malas), akan sangat mengganggu untuk menulis kode boilerplate setiap saat. Anda dapat menyimpan beberapa karakter dengan menggunakanload-json-file
modul.Versi asinkron
Versi sinkron
Parsing JSON dari stream
Jika konten JSON dialirkan melalui jaringan, Anda perlu menggunakan pengurai JSON streaming. Kalau tidak, itu akan mengikat prosesor Anda dan mencekik acara Anda sampai konten JSON sepenuhnya dialirkan.
Ada banyak paket yang tersedia di NPM untuk ini. Pilih yang terbaik untuk Anda.
Penanganan Kesalahan / Keamanan
Jika Anda tidak yakin jika apa pun yang dilewatkan ke
JSON.parse()
adalah JSON valid , pastikan untuk menyertakan panggilan untukJSON.parse()
di dalamtry/catch
blok. Pengguna yang menyediakan string JSON dapat merusak aplikasi Anda, dan bahkan dapat menyebabkan lubang keamanan. Pastikan penanganan kesalahan dilakukan jika Anda menguraikan JSON yang disediakan secara eksternal.sumber
and could even lead to security holes
karena penasaran, bagaimana?<script>...
, dan kesalahan tersebut tumpah ke sisi klien, Anda memiliki bug XSS di sana. Oleh karena itu IMO penting untuk menangani kesalahan JSON tepat di mana Anda menguraikannya.require
untuk memasukkan JSON?" dan bahkan tidak repot-repot mendokumentasikan efek sampingnya. Ini juga berarti bahwa memerlukan menerima file dalam dua bahasa: JavaScript, dan JSON (tidak, mereka tidak sama). Begitu banyak untuk SRP.gunakan objek JSON :
sumber
Contoh lain dari JSON.parse:
sumber
Saya ingin menyebutkan bahwa ada alternatif untuk objek JSON global.
JSON.parse
danJSON.stringify
keduanya sinkron, jadi jika Anda ingin berurusan dengan objek besar Anda mungkin ingin memeriksa beberapa modul JSON asinkron.Lihat: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
sumber
JSON.parse
seluruh aplikasi Anda akan mogok atau, menggunakanprocess.on('uncaughtException', function(err) { ... });
, pada akhirnya tidak akan ada kesempatan untuk mengirim kesalahan "malformasi JSON" kepada pengguna.async
parser? Saya tidak menemukannya.Sertakan
node-fs
perpustakaan.Untuk info lebih lanjut tentang perpustakaan 'fs', lihat dokumentasi di http://nodejs.org/api/fs.html
sumber
Karena Anda tidak tahu bahwa string Anda benar-benar valid, saya akan memasukkannya terlebih dahulu ke dalam try catch. Juga karena blok coba tangkap tidak dioptimalkan oleh node, saya akan meletakkan semuanya ke fungsi lain:
ATAU dalam "gaya async"
sumber
Parsing aliran JSON? Gunakan
JSONStream
.https://github.com/dominictarr/JSONStream
sumber
Semua orang di sini telah memberi tahu tentang JSON.parse, jadi saya berpikir untuk mengatakan sesuatu yang lain. Ada modul Connect hebat dengan banyak middleware untuk membuat pengembangan aplikasi lebih mudah dan lebih baik. Salah satu middleware adalah bodyParser . Ini mem-parsing JSON, html-bentuk dan lain-lain. Ada juga middleware khusus untuk parsing JSON hanya noop .
Lihatlah tautan di atas, mungkin ini sangat membantu Anda.
sumber
Itu saja.
sumber
seperti jawaban lain yang disebutkan di sini, Anda mungkin perlu meminta file json lokal yang Anda tahu aman dan ada, seperti file konfigurasi:
atau untuk menggunakan objek JSON global untuk mem-parsing nilai string ke objek:
perhatikan bahwa ketika Anda memerlukan file konten file itu dievaluasi, yang menimbulkan risiko keamanan jika itu bukan file json tetapi file js.
di sini, saya telah menerbitkan demo di mana Anda dapat melihat kedua metode dan bermain secara online (contoh parsing ada di file app.js - lalu klik tombol run dan lihat hasilnya di terminal): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
Anda dapat memodifikasi kode dan melihat dampaknya ...
sumber
Menggunakan JSON untuk konfigurasi Anda dengan Node.js? Baca ini dan dapatkan keterampilan konfigurasi Anda lebih dari 9000 ...
Aplikasi yang tepat hadir dalam 3+ lapisan konfigurasi:
Sebagian besar pengembang memperlakukan konfigurasi server dan aplikasi mereka seolah-olah itu dapat berubah. Tidak bisa. Anda dapat lapisan perubahan dari lapisan yang lebih tinggi di atas satu sama lain, tetapi Anda memodifikasi persyaratan dasar . Beberapa hal perlu ada! Buat config Anda bertindak seperti itu tidak dapat diubah, karena beberapa di antaranya pada dasarnya, sama seperti kode sumber Anda.
Gagal melihat bahwa banyak barang Anda tidak akan berubah setelah startup mengarah ke anti-pola seperti mengotori pemuatan konfigurasi Anda dengan blok coba / tangkap, dan berpura-pura Anda dapat melanjutkan tanpa aplikasi pengaturan yang benar. Kamu tidak bisa Jika Anda bisa, itu termasuk dalam lapisan konfigurasi komunitas / pengguna, bukan lapisan konfigurasi server / aplikasi. Anda salah melakukannya. Barang-barang opsional harus berlapis di atas ketika aplikasi selesai bootstrapnya.
Berhenti membenturkan kepala ke dinding: Konfigurasi Anda harus sangat sederhana .
Lihatlah betapa mudahnya men-setup sesuatu yang kompleks seperti kerangka layanan protokol-agnostik dan data-agnostik menggunakan file konfigurasi json sederhana dan file app.js sederhana ...
container-config.js ...
index.js ... (mesin yang menggerakkan segalanya)
app.js ... (kode yang mendukung layanan agnostik protokol-agnostik dan sumber data Anda)
Dengan menggunakan pola ini, Anda sekarang dapat memuat hal-hal konfigurasi komunitas dan pengguna di atas aplikasi yang telah Anda boot, dev ops siap untuk mendorong pekerjaan Anda ke dalam wadah dan menskalakannya. Anda membaca untuk multitenant. Userland terisolasi. Anda sekarang dapat memisahkan masalah protokol layanan mana yang Anda gunakan, tipe database apa yang Anda gunakan, dan hanya fokus pada penulisan kode yang baik.
Karena Anda menggunakan lapisan, Anda dapat mengandalkan satu sumber kebenaran untuk semuanya, kapan saja (objek konfigurasi berlapis), dan menghindari pemeriksaan kesalahan di setiap langkah, khawatir tentang "oh sial, bagaimana saya akan membuat ini bekerja tanpa konfigurasi yang tepat?!? "
sumber
Solusi saya:
sumber
TypeError: path must be a string or Buffer
kesalahan - ada ide di mana harus mulai men-debug masalah ini?Hanya ingin menyelesaikan jawabannya (karena saya berjuang untuk sementara waktu), ingin menunjukkan cara mengakses informasi json, contoh ini menunjukkan mengakses Json Array:
sumber
Hanya untuk membuat ini serumit mungkin, dan membawa paket sebanyak mungkin ...
Ini memungkinkan Anda melakukan:
Atau jika Anda menggunakan async / tunggu:
Keuntungan menggunakan hanya
readFileSync
adalah bahwa server Node Anda dapat memproses permintaan lain saat file sedang dibaca dari disk.sumber
JSON.parse tidak akan memastikan keamanan string json yang Anda parsing. Anda harus melihat perpustakaan seperti json-safe-parse atau perpustakaan serupa.
Dari halaman npm json-safe-parse:
sumber
Leverage fungsi upaya Lodash untuk mengembalikan objek kesalahan, yang dapat Anda tangani dengan fungsi isError.
sumber
.bind
alih-alih hanya menggunakan _.attempt (JSON.parse, str)Selalu pastikan untuk menggunakan JSON.parse di try catch block karena node selalu melempar Kesalahan Tidak Terduga jika Anda memiliki beberapa data yang rusak di json Anda, jadi gunakan kode ini alih-alih JSON sederhana.
sumber
Jika Anda ingin menambahkan beberapa komentar di JSON Anda dan membolehkan koma tertinggal Anda mungkin ingin menggunakan implementasi di bawah ini:
Perhatikan bahwa itu mungkin tidak berfungsi dengan baik jika Anda memiliki sesuatu seperti
"abc": "foo // bar"
di JSON Anda. Jadi YMMV.sumber
Jika file sumber JSON cukup besar, mungkin ingin mempertimbangkan rute asinkron melalui pendekatan async / tunggu asli dengan Node.js 8.0 sebagai berikut
sumber
Saya menggunakan fs-extra . Saya sangat menyukainya karena - walaupun mendukung panggilan balik - juga mendukung Janji . Jadi itu hanya memungkinkan saya untuk menulis kode saya dengan cara yang lebih mudah dibaca:
Ini juga memiliki banyak metode berguna yang tidak datang bersama dengan
fs
modul standar dan , di atas itu, juga menjembatani metode darifs
modul asli dan menjanjikannya.Jadi pada dasarnya semua keuntungan. Saya harap orang lain menganggap ini berguna.
sumber
Jika Anda perlu mengurai JSON dengan Node.js dengan cara yang aman (alias: pengguna dapat memasukkan data, atau API publik) Saya akan menyarankan menggunakan secure-json-parse .
Penggunaannya seperti default
JSON.parse
tetapi akan melindungi kode Anda dari:sumber
Anda dapat menggunakan JSON.parse () (yang merupakan fungsi bawaan yang mungkin akan memaksa Anda untuk membungkusnya dengan pernyataan try-catch).
Atau gunakan pustaka npm parsing JSON, sesuatu seperti json-parse-atau
sumber
Gunakan ini untuk berada di sisi yang aman
sumber
NodeJs adalah server berbasis JavaScript , sehingga Anda dapat melakukan hal itu dalam JavaScript murni ...
Bayangkan Anda memiliki Json ini di NodeJs ...
Dan Anda dapat melakukannya di atas untuk mendapatkan versi parsing dari json Anda ...
sumber
Seperti yang disebutkan dalam jawaban di atas, Kita dapat menggunakan
JSON.parse()
untuk mem-parsing string ke JSON. Tetapi sebelum mem-parsing, pastikan untuk mengurai data yang benar atau jika tidak, itu dapat menurunkan seluruh aplikasi Anda.aman untuk menggunakannya seperti ini
sumber
Gunakan
JSON.parse(str);
. Baca lebih lanjut di sini .Berikut ini beberapa contohnya:
sumber
Tidak perlu modul lebih lanjut.
Cukup gunakan
var parsedObj = JSON.parse(yourObj);
Saya tidak berpikir ada masalah keamanan tentang ini
sumber
Sederhana, Anda dapat mengonversi JSON menjadi menggunakan string
JSON.stringify(json_obj)
, dan mengonversi string ke menggunakan JSONJSON.parse("your json string")
.sumber