Рубрики
Без рубрики

Как читать и писать JSON-файлы с помощью Node.js | Руководство

Одним из лучших способов обмена информацией между приложениями, написанными на разных языках, является использование формата JSON (JavaScript Object Notation).

Одним из лучших способов обмена информацией между приложениями, написанными на разных языках, является использование формата JSON (JavaScript Object Notation). Благодаря своей унифицированности и простоте, JSON почти полностью заменил XML в качестве стандартного формата обмена данными в программном обеспечении, особенно в веб-сервисах.

Учитывая широкое использование JSON в программных приложениях, и особенно в приложениях на базе JavaScript, важно знать, как читать и записывать данные JSON в файл в Node.js. В этой статье мы объясним, как выполнять эти функции.

Чтение файла JSON

Давайте сначала посмотрим, как можно прочитать уже созданный файл. Но прежде чем мы это сделаем, нам нужно создать файл. Откройте новое окно в вашем любимом текстовом редакторе и добавьте в него следующий текст:

{ 
    "name": "Sara",
    "age": 23,
    "gender": "Female",
    "department": "History",
    "car": "Honda"
}

Теперь сохраните этот файл под именем “student.json” в директории вашего проекта.

Для чтения данных JSON из файла мы можем использовать модуль Node.js fs. В этом модуле есть две функции, которые мы можем использовать для чтения файлов из файловой системы: readFile и readFileSync.

Хотя обе эти функции выполняют схожие задачи, то есть чтение файлов с диска, разница заключается в том, как эти функции выполняются, о чем мы расскажем подробнее в следующих разделах.

Использование Fs.Readfilesync.

Функция readFileSync считывает данные из файла синхронно. Эта функция блокирует выполнение остальной части кода до тех пор, пока все данные не будут считаны из файла. Эта функция особенно полезна, когда вашему приложению необходимо загрузить параметры конфигурации, прежде чем оно сможет выполнять другие задачи.

Чтобы продолжить наш пример, давайте используем эту функцию для чтения файла “student.json“, который мы создали ранее, используя функцию readFileSync. Добавьте следующий код в файл ‘.js‘:

'use strict';

const fs = require('fs');

let rawdata = fs.readFileSync('student.json');
let student = JSON.parse(rawdata);
console.log(student);

В приведенном выше коде Node.js мы сначала загружаем модуль fs в наше приложение. Затем мы используем функцию readFileSync и передаем ей относительный путь к файлу, который мы хотим прочитать. Если вы выведете объект rawdata на консоль, вы увидите необработанные данные (в буфере) на экране консоли:

<Buffer 7b 20 0a 20 20 20 20 22 6e 61 6d 65 22 3a 20 22 53 61 72 61 22 2c 0a 20 20 20 20 22 61 67 65 22 3a 20 32 33 2c 0a 20 20 20 20 22 67 65 6e 64 65 72 22 ... >

Однако мы хотим прочитать файл в формате JSON, а не необработанные шестнадцатеричные данные. Именно здесь в игру вступает функция JSON.parse. Эта функция разбирает необработанные данные, преобразует их в текст ASCII и разбирает фактические данные JSON в объект JavaScript. Теперь, если вы выведете объект student на консоль, вы получите следующий результат:

{ 
  name: 'Sara',
  age: 23,
  gender: 'Female',
  department: 'History',
  car: 'Honda'
}

Как вы можете видеть, JSON из нашего файла был успешно загружен в объект student.

Использование fs.readFile

Еще один способ чтения JSON-файла в Node.js – это использование функции readFile. В отличие от функции readFileSync, функция readFile читает данные файла асинхронно. При вызове функции readFile начинается процесс чтения файла, и сразу же управление переходит к следующей строке, выполняющей оставшиеся строки кода. Как только данные файла будут загружены, эта функция вызовет предоставленную ей функцию обратного вызова. Таким образом, вы не блокируете выполнение кода, ожидая, пока операционная система вернется к вам с данными.

В нашем примере функция readFile принимает два параметра: путь к файлу, который нужно прочитать, и функцию обратного вызова, которая будет вызвана, когда файл будет прочитан полностью. По желанию можно также включить параметр с опциями, но мы не будем рассматривать их в этой статье.

Посмотрите на следующий пример, чтобы понять, как использовать функцию readFile.

'use strict';

const fs = require('fs');

fs.readFile('student.json', (err, data) => {
    if (err) throw err;
    let student = JSON.parse(data);
    console.log(student);
});

console.log('This is after the read call');

Приведенный выше код делает то же самое, что и наш предыдущий фрагмент кода (с дополнительным вызовом console.log), но делает это асинхронно. Вот несколько отличий, которые вы, возможно, заметили:

  • (err, data) => {}: Это наша функция обратного вызова, которая выполняется, когда файл полностью прочитан.
  • err: Поскольку мы не можем легко использовать try/catch с асинхронным кодом, функция вместо этого дает нам объект err, если что-то идет не так. Он равен null, если ошибок не было.

Возможно, вы также заметили, что сразу после вызова readFile мы выводим строку в консоль. Это сделано для того, чтобы показать вам поведение асинхронного кода. Когда приведенный выше сценарий будет выполнен, вы увидите, что этот console.log выполняется до того, как будет выполнена функция обратного вызова readFile. Это происходит потому, что readFile не блокирует выполнение кода, пока он читает данные из файловой системы.

Вывод кода будет выглядеть следующим образом:

This is after the read call
{ 
  name: 'Sara',
  age: 23,
  gender: 'Female',
  department: 'History',
  car: 'Honda' 
}

Как вы можете видеть, последняя строка кода в нашем файле на самом деле является той, которая отображается первой в выводе.

Использование require

Другой подход заключается в использовании глобального метода require для чтения и разбора файлов JSON. Это тот же метод, который вы используете для загрузки модулей Node, но он также может быть использован для загрузки JSON.

Взгляните на следующий пример.

'use strict';

let jsonData = require('./student.json');

console.log(jsonData);

Она работает точно так же, как код readFileSync, который мы показали выше, но это глобально доступный метод, который вы можете использовать где угодно, что имеет свои преимущества.

Однако у функции require есть несколько недостатков:

  • Require является синхронной функцией и вызывается только один раз, что означает, что вызовы получают кэшированный результат. Если файл обновлен, вы не сможете повторно прочитать его, используя этот метод.
  • Ваш файл должен иметь расширение ‘.json’, поэтому он не может быть таким гибким. Без соответствующего расширения require не воспринимает файл как JSON-файл.

Запись JSON в файл

Подобно функциям readFile и readFileSync, существуют две функции для записи данных в файлы: writeFile и writeFileSync. Как следует из названий, метод writeFile записывает данные в файл асинхронно, а функция writeFileSync записывает данные в файл синхронно.

Мы рассмотрим это подробнее в следующих разделах.

Использование Fs.writefileSync.

Функция writeFileSync принимает 2-3 параметра: Путь к файлу, в который нужно записать данные, данные для записи и необязательный параметр.

Обратите внимание, что если файл еще не существует, то для вас будет создан новый файл. Взгляните на следующий пример:

'use strict';

const fs = require('fs');

let student = { 
    name: 'Mike',
    age: 23, 
    gender: 'Male',
    department: 'English',
    car: 'Honda' 
};
 
let data = JSON.stringify(student);
fs.writeFileSync('student-2.json', data);

В приведенном выше примере мы сохраняем наш JSON-объект student в файл с именем “student-2.json“. Обратите внимание, что здесь мы должны использовать функцию JSON.stringify перед сохранением данных. Точно так же, как нам нужно было разобрать данные в формат JSON, когда мы читали JSON-файл, нам нужно преобразовать данные в строку, прежде чем мы сможем сохранить их в файле.

Выполните приведенный выше код и откройте файл “student-2.json“. В файле вы должны увидеть следующее содержимое:

{
  "name":"Mike",
  "age":23,
  "gender":"Male",
  "department":"English",
  "car":"Honda"
}

Хотя это и есть те данные, которые мы хотели записать, они находятся в виде одной строки, которую нам трудно прочитать. Если вы хотите, чтобы сериализованный JSON был читабельным, измените функцию JSON.Stringify следующим образом:

let data = JSON.stringify(student, null, 2);

Здесь мы указываем методу добавить новые строки и пару отступов к сериализованному JSON. Теперь, если вы откроете файл “student-2.json“, вы увидите текст в следующем формате.

{
  "name": "Mike",
  "age": 23,
  "gender": "Male",
  "department": "English",
  "car": "Honda"
}

Использование fs.writefile

Как я уже говорил, функция writeFile выполняется асинхронно, что означает, что наш код не блокируется, пока данные записываются в файл. И так же, как и в случае с асинхронными методами, нам нужно передать этой функции обратный вызов.

Давайте запишем еще один файл, “student-3.json”, используя функцию writeFile.

'use strict';

const fs = require('fs');

let student = { 
    name: 'Mike',
    age: 23, 
    gender: 'Male',
    department: 'English',
    car: 'Honda' 
};
 
let data = JSON.stringify(student, null, 2);

fs.writeFile('student-3.json', data, (err) => {
    if (err) throw err;
    console.log('Data written to file');
});

console.log('This is after the write call');

Выход вышеуказанного скрипта будет:

This is after the write call
Data written to file

И снова вы видите, что последняя строка нашего кода на самом деле отображается в консоли первой, поскольку наш обратный вызов еще не был вызван. Это позволяет сэкономить время выполнения, если у вас большой объем данных для записи в файл или если у вас несколько файлов для записи.

Заключение

В этой статье мы показали, как можно читать и записывать данные JSON из файлов и в файлы, что является очень распространенной и важной задачей для веб-программиста.

В модуле fs есть несколько методов для чтения из JSON-файлов и записи в них. Функции readFile и readFileSync считывают данные JSON из файла асинхронно и синхронно, соответственно. Вы также можете использовать глобальный метод require для обработки чтения/разбора данных JSON из файла в одной строке кода. Однако метод require является синхронным и может читать данные JSON только из файлов с расширением ‘.json‘.

Аналогично, функции writeFile и writeFileSync из модуля fs записывают данные JSON в файл асинхронно и синхронно соответственно.

Оригинал: “https://stackabuse.com/reading-and-writing-json-files-with-node-js/”