Все, что вы когда-либо хотели знать о JSON, но боялись спросить… почему-то
JSON — это просто отличный формат передачи данных, но иногда мы просто забываем о нем. Мы сосредотачиваемся на использовании других форматов, таких как CSV, XML и YAML, и забываем об одном факте, который разработчики JS всегда должны помнить: JSON означает JavaScript . Oобъект Nповорот.
Другими словами, у нас есть встроенная поддержка, так что давайте воспользуемся этим!
Разбор JSON в JavaScript
«Синтаксический анализ» по существу означает преобразование строки во что-то другое.
Теперь есть 2 сценария, в которых это может пригодиться при работе с JSON в JavaScript. В конце концов, нам нравится формат, но если он у вас сериализован (в форме String), вы мало что можете с ним сделать, не так ли?
Сценарий 1: превращение String в настоящий объект
Очень распространенным сценарием может быть то, что вы либо читаете строку, либо получаете ее в качестве ввода от вашего пользователя, возможно, в качестве параметра запроса. Дело в том, что вы столкнулись со строкой, которая выглядит так:
"{\n \"name\": \"Fernando Doglio\",\n \"author\": true,\n \"age\": 38\n}"
Теперь это допустимая строка, но мы не можем присвоить ее переменной и рассматривать ее как объект, не так ли?
К счастью для вас, есть очень простой способ разобрать это: с помощью метода JSON.parse
.
Правильно, есть волшебный глобальный объект с именем JSON
(обратите внимание на имя в верхнем регистре), который вы можете использовать для разбора (а также преобразования в строку) строки JSON.
Итак, все, что нам нужно сделать, это:
Это все, что вам нужно, теперь вы можете, как в примере, обращаться со значением как с объектом.
Сценарий 2: Чтение JSON из файла в Node.js
Это особый вариант использования, который, хотя он может не применяться ко всем, я думаю, также важно понимать.
Основываясь на приведенном выше примере, можно предположить, что для чтения содержимого файла JSON вам нужно будет прочитать его с помощью чего-то вроде fs.readFile
, а затем проанализировать его содержимое с помощью JSON.parse
. И это сработает.
Однако Node.js делает это еще проще, потому что вы можете просто импортировать его напрямую, и он сделает всю работу за вас!
const myJSON = require("path/to/file.json")
Конечно, это использует функцию require
, поскольку оператор import
из ES6 до сих пор ее не поддерживает. Есть предложение по нему, которое в настоящее время находится на стадии 3, так что, возможно, однажды мы сможем импортировать и его.
Что произойдет, если JSON недействителен?
Одна важная вещь, которую следует помнить об этом формате, заключается в том, что он не похож на буквальное обозначение объекта.
Если вы не используете двойные кавычки или оставляете запятую где-то внутри, JSON будет недействительным, и любой из вышеперечисленных методов вызовет исключение.
Вот почему вам обычно нужно обернуть вызов parse
блоком try...catch
, если, конечно, вы не абсолютно доверяете источнику строки, но просто для перепроверки обязательно всегда добавляйте блок:
Это гарантирует, что ваше приложение не сломается, если возникнет проблема с вашим JSON. И если сообщение об ошибке недостаточно понятно (иногда оно может быть немного загадочным), вы можете использовать онлайн-валидатор, например https://jsonformatter.org/json-parser. Эти инструменты помогут вам, если вы не можете определить точную проблему с вашим файлом.
Использование дополнительной функции оживления
Хотя приведенного выше более чем достаточно, могут быть случаи, когда вам понадобится дополнительная информация при разборе вашего JSON. Возможно, во время синтаксического анализа вам нужно повлиять или, по крайней мере, проверить анализируемые ключи и значения.
Возможно, вам даже нужно обрезать некоторые значения, потому что вы знаете, что они вам не понадобятся. Вы можете определенно сделать это после разбора. Но зачем ждать, если вы можете использовать дополнительную функцию обратного вызова под названием «reviver» (без понятия, почему это имя, BTW) с методом parse
и позаботиться об этом там.
Эта функция будет вызываться для каждого ключа в вашем JSON, и она получит ключ и соответствующее ему значение. Так, например, если вы хотите заглавными буквами каждое строковое значение в вашем JSON, вы должны сделать что-то вроде этого:
Этот код, конечно же, выведет:
Name: FERNANDO DOGLIO Country: SPAIN
Вы также можете обрезать (удалить) некоторые ключи, не возвращая их значения (обратите внимание, как в моем предыдущем примере я возвращал каждое значение, даже если оно не было строкой):
Затем это выведет что-то вроде этого:
Обратите внимание, как удобно я удалил свой возраст из проанализированного результата.
Добавление проверок типов и структуры в JSON
Опять же, это совершенно необязательно, но если вам нужно добавить некоторые проверки типа данных в ваши JSON или даже структурные проверки, чтобы убедиться, что вы не пропускаете обязательные свойства, важно понимать одну вещь: вы не можете .
То есть можно, конечно, но не нативно. Стандарт JSON не поддерживает ни одну из этих проверок. По умолчанию вы не можете указать тип свойства или даже сделать его обязательным. Черт возьми, нет схемы, на которой можно основывать эти проверки, поэтому, если это то, что вам нужно, перестаньте читать документы JSON.
Вместо этого обратите внимание на JSONSchema. Это официальный способ добавления структурных проверок в ваши JSON. Да, вам потребуется добавить дополнительный файл для объявления вашей схемы, и да, вам нужно будет добавить внешнюю библиотеку для ее поддержки, поскольку она не является частью стандарта JSON JS.
Однако, поскольку это единственный реальный способ для разработчиков поддерживать эту функциональность, существуют библиотеки для большинства распространенных языков. И да, это, конечно, включает JavaScript.
Вот — это список валидаторов схемы, которые вы можете включить в качестве зависимости для своего проекта. Большинство из них работают следующим образом: сначала вы пишете схему, которая, как ни странно, в формате JSON, затем анализируете (загружаете) ее и, наконец, проверяете свои JSON по ней.
Вот пример того, как будет выглядеть схема для JSON, которую я до сих пор использовал в качестве примера:
Это немного многословно, я дам вам это, но это позволяет вам точно указать, как должно выглядеть каждое свойство, и в конце вы даже можете указать, какие из них должны быть всегда. Поскольку тогда я удалил свойство age
, я решил сделать его здесь необязательным.
Первые 5 свойств предназначены больше для парсера ($schema
и $id
) или для человека, читающего схему (title
и description
).
Использование схем для проверки JSON очень распространено в таких сценариях, как API, где вы ожидаете определенную полезную нагрузку с предварительно определенным форматом, и вы можете проверить ее и вернуть ошибку 4XX, если она не соответствует структурным требованиям (если схема не проходит проверку).
Другим примером может быть загрузка файла конфигурации в формате JSON. Если пользователь может вмешиваться в этот файл, возможно, вы захотите провести какие-то проверки перед использованием этих данных, чтобы убедиться, что они имеют смысл.
Если вы хотите использовать схемы для проверки вашего JSON, я настоятельно рекомендую вам прочитать официальную документацию, в ней есть все, что вам нужно, чтобы разобраться с ней.
Формат JSON очень мощный, но иногда люди просто игнорируют его, потому что предполагают, что он точно такой же, как литеральная нотация объекта в JavaScript. И хотя есть некоторые сходства, как вы видели, JSON допускает гораздо больше.
Если вам понравилось и вы узнали что-то новое, оставьте комментарий с другой темой, которую вы хотели бы узнать о JS, и я расскажу об этом в своей следующей статье «JavaScript 101».
Увидимся на следующем!