Pertanyaan Bagaimana cara mengurai JSON menggunakan Node.js?


Bagaimana saya harus mengurai JSON menggunakan Node.js? Apakah ada modul yang akan memvalidasi dan mengurai JSON dengan aman?


852
2018-04-20 07:10


asal


Jawaban:


Anda cukup menggunakan JSON.parse.

node.js dibangun di atas V8, yang menyediakan objek global JSON[dokumen]. Definisi dari JSON obyek merupakan bagian dari spesifikasi ECMAScript 5.

Catatan - JSON.parse dapat mengikat benang saat ini karena itu adalah metode sinkron. Jadi jika Anda berencana untuk mengurai objek-objek JSON besar, gunakan pengalih json streaming.


990
2018-04-20 07:13



kamu bisa memerlukan .json file.

var parsedJSON = require('./file-name');

Misalnya jika Anda memiliki config.json file di direktori yang sama dengan file kode sumber Anda yang akan Anda gunakan:

var config = require('./config.json');

atau (ekstensi file dapat dihilangkan):

var config = require('./config');

catat itu require aku s sinkronis dan hanya membaca file sekali, panggilan berikut mengembalikan hasil dari cache

Perhatikan juga Anda hanya boleh menggunakan ini untuk file lokal di bawah kendali mutlak Anda, karena berpotensi mengeksekusi kode apa pun di dalam file.


621
2018-03-21 12:46



Kamu dapat memakai JSON.parse().

Anda harus bisa menggunakan JSON keberatan apa saja ECMAScript 5 implementasi JavaScript yang kompatibel. Dan V8, di mana Node.js dibangun adalah salah satunya.


Mem-parsing string yang berisi data JSON

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

Mem-parsing file yang berisi data JSON

Anda harus melakukan beberapa operasi file dengan fs modul.

Versi asinkron

var fs = require('fs');

fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
    if (err) throw err; // we'll not consider error handling for now
    var obj = JSON.parse(data);
});

Versi sinkron

var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));

Anda ingin digunakan require? Pikirkan lagi!

Terkadang Anda dapat menggunakannya require:

var obj = require('path/to/file.json');

Tapi, saya tidak merekomendasikan ini karena beberapa alasan:

Catatan: Jika Anda menggunakan file JSON untuk menyimpan informasi sensitif (mis. Kata sandi), itu cara yang salah untuk melakukannya. Lihat bagaimana Heroku melakukannya: https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application. Cari tahu bagaimana platform Anda melakukannya, dan gunakan process.env untuk mengambil var config dari dalam kode.

  1. require sinkron. Jika Anda memiliki file JSON yang sangat besar, itu akan mencekik perulangan acara Anda. Anda benar-benar perlu menggunakannya JSON.parse dengan fs.readFile.
  2. require akan membaca file hanya sekali. Panggilan selanjutnya ke require untuk file yang sama akan mengembalikan salinan cache. Bukan ide yang bagus jika Anda ingin membaca .json file yang terus diperbarui. Anda bisa menggunakannya sebuah peretasan. Tetapi pada titik ini, lebih mudah untuk digunakan fs.
  3. Jika file Anda tidak memiliki file .json perpanjangan, require tidak akan memperlakukan isi file sebagai JSON.

Serius! Menggunakan JSON.parse.


jsonfile modul

Jika Anda membaca banyak .json file, (dan jika Anda sangat malas), itu menjadi menjengkelkan untuk menulis kode boilerplate setiap waktu. Anda dapat menyimpan beberapa karakter dengan menggunakan jsonfile modul.

var jf = require('jsonfile');

Versi asinkron

jf.readFile('/path/to/file.json', function(err, obj) {
  // obj contains JSON data
});

Versi sinkron

var obj = jf.readFileSync('/path/to/file.json');

Mengurai JSON dari aliran

Jika konten JSON dialirkan melalui jaringan, Anda perlu menggunakan pengalih streaming JSON. Jika tidak, itu akan mengikat prosesor Anda dan mencekik loop acara Anda sampai konten JSON sepenuhnya dialirkan.

Ada banyak paket tersedia di NPM untuk ini. Pilih yang terbaik untuk Anda.


Penanganan Kesalahan / Keamanan

Jika Anda tidak yakin jika apa pun yang diteruskan ke JSON.parse() aku s JSON yang valid, pastikan untuk menyertakan panggilan ke JSON.parse() di dalam try/catch blok. Pengguna yang memberikan string JSON dapat merusak aplikasi Anda, dan bahkan dapat menyebabkan lubang keamanan. Pastikan penanganan kesalahan dilakukan jika Anda mengurai JSON yang disediakan secara eksternal.


279
2017-09-07 13:35



menggunakan Objek JSON:

JSON.parse(str);

78
2018-04-20 07:13



Contoh lain dari JSON.parse:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
  if (err) {
    console.log('Error: ' + err);
    return;
  }

  data = JSON.parse(data);

  console.dir(data);
});

33
2017-07-24 09:15



Saya ingin menyebutkan bahwa ada alternatif untuk objek JSON global. JSON.parse dan JSON.stringify keduanya sinkron, jadi jika Anda ingin berurusan dengan objek besar Anda mungkin ingin memeriksa beberapa modul JSON asynchronous.

Silahkan lihat: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json


32
2017-08-27 07:45



Termasuk node-fs Perpustakaan.

var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));

Untuk info lebih lanjut tentang pustaka 'fs', lihat dokumentasi di http://nodejs.org/api/fs.html


28
2018-04-03 11:15



Karena Anda tidak tahu bahwa string Anda benar-benar valid, saya akan memasukkannya terlebih dahulu ke dalam tangkapan percobaan. Juga sejak mencoba menangkap blok tidak dioptimalkan oleh node, saya akan menempatkan semuanya ke dalam fungsi lain:

function tryParseJson(str) {
    try {
        return JSON.parse(str);
    } catch (ex) {
        return null;
    }
}

ATAU dalam "async style"

function tryParseJson(str, callback) {
    process.nextTick(function () {
      try {
          callback(null, JSON.parse(str));
      } catch (ex) {
          callback(ex)
      }
    })
}

9
2017-07-26 16:48



Mem-parsing aliran JSON? Menggunakan JSONStream.

var request = require('request')
  , JSONStream = require('JSONStream')

request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
    .pipe(JSONStream.parse('rows.*'))
    .pipe(es.mapSync(function (data) {
      return data
    }))

https://github.com/dominictarr/JSONStream


8
2017-07-10 09:54



JSON.parse("your string");

Itu saja.


7
2018-06-12 06:47



seperti jawaban lain yang telah disebutkan di sini, Anda mungkin ingin memerlukan file json lokal yang Anda tahu aman dan ada, seperti file konfigurasi:

var objectFromRequire = require('path/to/my/config.json'); 

atau menggunakan objek JSON global untuk menguraikan nilai string ke dalam objek:

var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);

perhatikan bahwa ketika Anda membutuhkan file, konten file itu dievaluasi, yang memperkenalkan risiko keamanan jika itu bukan file json tetapi file js.

di sini, saya telah memublikasikan demo di mana Anda dapat melihat kedua metode dan bermain dengan mereka secara online (contoh parsing ada di file app.js - kemudian klik tombol run dan lihat hasilnya di terminal): http://staging1.codefresh.io/labs/api/env/json-parse-example

Anda dapat memodifikasi kode dan melihat pengaruhnya ...


6
2018-01-05 19:09