Node.js で Json を解析する

Isaac Tony 2022年3月30日
Node.js で Json を解析する

このセクションでは、Nodejs で JSON を同期的に解析する方法を学びます。JSON データの解析は、現在使用している特定の言語で JSON データを解釈するプロセスと呼ばれる場合があります。

JSON データは、多くの場合、JSON 仕様に従いながら、引用符で囲まれた文字列値としてキーと値のペアで保存されます。サーバーから受信した、または API によって返される JSON データは、多くの場合、文字列形式です。この生の形式では、JSON データは簡単に読み取ったりアクセスしたりできないため、よりユーザーフレンドリーな形式に変換する必要があります。

Nodejs で JSON ファイルを解析するために使用できる主な方法は 3つあります。ローカルファイル、つまりローカルコンピューターのストレージにあるファイルの場合、モジュールを Nodejs 環境にロードするために使用される require() 関数を使用できます。ただし、このメソッドは同期的です。つまり、現在のファイルが完全に解析されるまで、このプログラムは他に何も実行しません。

[
    {
      "id": 0,
      "name": "Maribel Andrews"
    },
    {
      "id": 1,
      "name": "Gilliam Mcdonald"
    },
    {
      "id": 2,
      "name": "Lisa Wright"
    }
  ]
const friends  = require("./friends.json");
 
console.log(friends);

サンプル出力:

[
  { id: 0, name: 'Maribel Andrews' },
  { id: 1, name: 'Gilliam Mcdonald' },
  { id: 2, name: 'Lisa Wright' }
]

このプログラムは動的プログラムの操作には適していませんが、静的ファイルの操作には適していません。データを変更する可能性のあるプログラムでは、変更が行われた後、データをもう一度解析する必要があります。これは、JSON ファイルを解析するための最良の方法ではありません。

または、モジュールとしてロードする代わりに、fs モジュールと fs.readFileSync() を使用して JSON ファイルをロードすることもできます。fs モジュールは、ファイルの読み取り、名前の変更、削除などのファイル操作を実行するためのより効率的な方法です。fs.readFileSync() は、ファイルとその内容を同期的に読み取ることができるインターフェイスです。

[
    {
      "id": 0,
      "name": "Maribel Andrews"
    },
    {
      "id": 1,
      "name": "Gilliam Mcdonald"
    },
    {
      "id": 2,
      "name": "Lisa Wright"
    }
  ]
const fs = require("fs");
 
const friends = fs.readFileSync("./friends.json");
 
 
console.log(friends);

サンプル出力:

<Buffer 5b 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 22 69 64 22 3a 20 30 2c 0d 0a 20 20 20 20 20 20 22 6e 61 6d 65 22 3a 20 22 4d 61 72 69 62 65 6c 20 41 ... 144 more bytes>

JSON ファイルを正常にロードしましたが、エンコード形式を指定していません。readFileSync() メソッドは、エンコーディングパラメータが指定されていない場合、つまり null の場合に raw バッファを返します。テキストファイルのエンコード形式は通常 utf-8 です。

const fs = require("fs");
 
const friends = fs.readFileSync("./friends.json", {encoding: 'utf-8'});
 
console.log(friends);

サンプル出力:

[
    {
      "id": 0,
      "name": "Maribel Andrews"
    },
    {
      "id": 1,
      "name": "Gilliam Mcdonald"
    },
    {
      "id": 2,
      "name": "Lisa Wright"
    }
  ]

JSON ファイルの読み取りに成功したので、JSON 文字列を JSON オブジェクトに解析できます。これは、JSON.parse() 関数を使用して行うことができます。これは、JSON 文字列をオブジェクトに変換するために使用できる JavaScript 関数です。

この関数は、解析される JSON 文字列と reviver と呼ばれるオプションのパラメーターの 2つのパラメーターを受け入れます。mozilla.org によると、reviver パラメーターが関数の場合、最初に解析された値がどのように変換されるかを指定します。

const fs = require("fs");
 
const friends = fs.readFileSync("./friends.json", {encoding: 'utf-8'});
 
const parsed_result = JSON.parse(friends);
 
 
console.log(parsed_result);

出力:

[
  { id: 0, name: 'Maribel Andrews' },
  { id: 1, name: 'Gilliam Mcdonald' },
  { id: 2, name: 'Lisa Wright' }
]

このセクションでは、JSON 文字列を非同期で解析する方法を説明します。前の例では、JSON 文字列データを同期的に解析する方法を見てきました。ただし、Node js では、特にデータが大きい場合、同期関数の記述は不適切であると見なされます。

メソッド fs.readFile() を使用して JSON 文字列データを JSON オブジェクトに解析し、関数をコールバックできます。

データがバックグラウンドでフェッチされている間にプログラムの残りの部分が実行されることが保証され、データがロードされるための不要な待機時間が短縮されます。

const fs = require('fs');
 
fs.readFile('./friends.json',{encoding: 'utf-8'}, (err, data) => {
  if (err) console.error(err);
  const parsed_data  = JSON.parse(data);
 
  console.log(parsed_data);
});
 
console.log("Rest of the program that needs to be executed!");

サンプル出力:

Rest of the program that needs to be executed!
[
  { id: 0, name: 'Maribel Andrews' },
  { id: 1, name: 'Gilliam Mcdonald' },
  { id: 2, name: 'Lisa Wright' }
]

この方法は、前述の同期方法よりも巨大なデータを処理する場合に適したオプションのように見えるかもしれませんが、そうではありません。外部ソースからのデータがある場合、新しい変更が加えられたときに常にデータを再ロードする必要があります。これは、同期メソッドを使用する場合と同じシナリオです。ネイティブ Nodejs ストリーム APIS は、巨大な外部データを操作する場合に推奨される代替手段です。

著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn