在 Node.js 中解析 Json

Isaac Tony 2022年5月13日
在 Node.js 中解析 Json

在本节中,我们将学习在 Node js 中同步解析 JSON。解析 JSON 数据可能被称为以你当前可能使用的特定语言解释 JSON 数据的过程。

JSON 数据通常存储在键值对中,作为用引号括起来的字符串值,同时仍然遵循 JSON 规范。从服务器接收或由 API 返回的 JSON 数据通常采用字符串格式。在这种原始格式中,JSON 数据不易读取和访问,因此需要转换为更用户友好的形式。

我们可以使用三种主要方法来解析 Node js 中的 JSON 文件。对于本地文件,即那些驻留在本地计算机存储中的文件,我们可以使用 require() 函数将模块加载到 Node js 环境中。但是,此方法是同步的,这意味着该程序在当前文件完全解析之前不会执行任何其他操作。

[
    {
      "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)返回原始缓冲区。文本文件的编码格式通常是 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() 函数来做到这一点。这是一个 javascript 函数,我们可以使用它来将 JSON 字符串转换为对象。

此函数接受两个参数:要解析的 JSON 字符串和称为 reviver 的可选参数。根据 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' }
]

虽然在处理大量数据时,这种方法似乎比前面讨论的同步方法更好,但事实并非如此。当我们有来自外部源的数据时,我们经常需要在进行新的更改时再次重新加载数据;这与使用同步方法时的情况相同。在处理大量外部数据时,推荐使用本机 Node js 流 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