Перевірка JSON
Просунутий онлайн валідатор синтаксису JSON та перевірка схем — повністю браузерний та орієнтований на конфіденційність.
Перевірте свій JSON миттєво
Цей безкоштовний онлайн-валідатор JSON дозволяє миттєво перевірити ваші JSON-дані на синтаксичні помилки та структурні проблеми. Незалежно від того, чи ви перевіряєте сирі відповіді API, конфігураційні файли чи структуровані повідомлення, наш інструмент в режимі реального часу підсвічує помилки та навіть пропонує автоматичні виправлення. Для суворішої перевірки додайте JSON-схему та застосуйте правила, такі як обов’язкові поля, конкретні типи та формати (електронна пошта, URI тощо). Інструмент повністю відповідає стандарту JSON Schema Draft-07. Уся обробка відбувається у вашому браузері — ваші дані ніколи не залишають ваш пристрій.
Що таке валідація JSON?
JSON (JavaScript Object Notation) — це широко вживаний, легкий формат обміну даними, створений для зручного читання людьми та простоти обробки машинами. Його основна мета — представляти структуровані дані — об’єкти, масиви, рядки, числа, булеві значення та null — у незалежному від мови форматі.
Перевірка JSON — це процес програмної перевірки того, що JSON-документ є синтаксично та структурно коректним. Це включає перевірку двох основних аспектів:
- Синтаксична перевірка: Забезпечення того, що сирий текст відповідає офіційній граматиці, визначеній у специфікації ECMA-404 JSON. Парсери у більшості сучасних мов програмування (наприклад, JSON.parse() у JavaScript, json.loads() у Python, JSONDecoder у Java) очікують коректний синтаксис і видають помилки, якщо вхідні дані мають неправильний формат.
- Структурна (схемна) валідація: Окрім синтаксису, валідація схеми перевіряє, чи відповідають дані JSON очікуваній структурі, включаючи типи даних, обов’язкові властивості, обмеження значень та вкладені об’єкти/масиви. Валідація схеми зазвичай здійснюється за допомогою JSON Schema — стандарту, що визначає правила для дійсних даних.
Чому варто перевіряти JSON?
Перевірка JSON є надзвичайно важливою у будь-яких випадках серіалізації даних для передачі, зберігання або міжсервісної комунікації. Основні причини включають:
- Запобігання помилкам: Виявляйте та повідомляйте про синтаксичні помилки (наприклад, відсутні коми, незакриті дужки, заборонені символи) на ранніх етапах — до початку обробки даних.
- Цілісність даних та безпека: Відхилення некоректних або шкідливих JSON-запитів, що допомагає запобігти збоїв у роботі сервера, ін’єкційним атакам та пошкодженню даних.
- Безпека типів: Забезпечте суворе типізування — наприклад, щоб поле, яке має бути логічним (boolean), не надсилалося як рядок, а UUID, електронні адреси та числа відповідали правильному формату.
- Крос-мовна сумісність: Гарантуйте, що JSON, створений в одному середовищі (наприклад, Node.js), буде безпечно використовуватись в іншому (наприклад, Python, Go, Java), уникаючи помилок серіалізації/десеріалізації.
- Обслуговуваність та Надійність: Перевірені структури даних покращують відстежуваність та зменшують ризик важкоусувних помилок у конфігураційних файлах, журналах та API-запитах/відповідях.
- Конфіденційність і безпека: перевірка може виконуватися повністю на стороні клієнта (у браузері), що запобігає передачі необроблених або конфіденційних даних за межі пристрою користувача для валідації.
Поширені помилки перевірки JSON (з докладними прикладами)
Ключі без лапок
Усі ключі в об’єктах JSON мають бути рядками в подвійних лапках.
{ name: "Аліса" }
{ "name": "Аліса" }
Багато форматів, подібних до JSON (наприклад, літерали об'єктів у JavaScript), дозволяють використовувати ключі без лапок, але стандартний JSON такого не підтримує.
Одинарні лапки
JSON-рядки повинні використовувати лише подвійні лапки; одинарні лапки не дозволені.
{ 'name': 'Боб' }
{ "name": "Боб" }
Використання одинарних лапок призведе до помилок парсера у всіх сумісних бібліотеках JSON.
Закінчувальні коми
Після останнього елемента в об’єкті або масиві не ставте кому.
{ "a": 1, "b": 2, }
{ "a": 1, "b": 2 }
Закінчувальні коми можуть працювати в JavaScript, але не підтримуються суворими JSON-парсерами.
Неправильне екранування символів
Кавички та спеціальні символи всередині рядків мають бути екрановані за допомогою зворотної скісної риски.
{ "quote": "Том сказав «привіт»" }
{ "quote": "Том сказав \"привіт\"" }
Інші послідовності виведення включають \\ для зворотного слеша, \n для нових рядків і \t для табуляції.
Неправильні типи даних
Для чисел, булевих значень або null не слід використовувати рядки.
{ "enabled": "так", "count": "10" }
{ "увімкнено": true, "кількість": 10 }
JSON розрізняє логічні значення, числа та рядки — переконайтеся, що використовується правильний тип.
Непрості ключі
Ключі в об'єктах JSON завжди повинні бути рядками; ви не можете використовувати числа, булеві значення або інші типи як ключі.
{ 123: "абв" }
{ "123": "абв" }
Повторювані ключі
Хоча це дозволено специфікацією JSON, дублікати ключів часто стають причиною помилок.
{ "name": "Аліса", "name": "Боб" }
Більшість парсерів збережуть лише останнє значення («Боб»), мовчки ігноруючи попередні.
Використання коментарів
Стандартний JSON не підтримує коментарі, хоча деякі редактори їх і підтримують.
{ // Інформація про користувача "name": "Аліса" }
{ "name": "Аліса" }
Перевірка Схеми: Забезпечення Структури та Типів Даних
JSON Schema — це потужний стандарт для визначення та перевірки очікуваної структури JSON-документів. Він дає змогу вказати:
- Обов’язкові поля (`required`)
- Типи даних (`type`: рядок, число, логічний, об'єкт, масив, null)
- Формати рядків (`format`: електронна пошта, uuid, дата-час тощо)
- Пошук за зразком для рядків (`pattern`)
- Діапазони чисел (`мінімум`, `максимум`)
- Перевірка довжини масиву та елементів (`minItems`, `maxItems`, `items`)
- Вкладена валідація для об'єктів та масивів
- Обмеження перелічень (`enum`)
Приклад: Схема користувача (Draft-07)
{ "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string", "minLength": 1 }, "email": { "type": "string", "format": "email" }, "is_active": { "type": "boolean" } }, "required": ["id", "name", "email"], "additionalProperties": false }
Що це забезпечує:
- id має бути дійсним рядком у форматі UUID.
- ім’я повинне бути непорожнім рядком.
- електронна пошта повинна відповідати стандартному формату email.
- is_active (необов’язково) має бути булевим значенням.
- Дозволені лише властивості, визначені вище.
Приклад із реального життя: перевірка відповідей API Stripe
Припустімо, ви отримуєте JSON-відповіді від API Stripe (наприклад, PaymentIntent). Валідація схеми гарантує, що ви ніколи не обробляєте неповні або неправильно типізовані дані.
{ "type": "object", "properties": { "id": { "type": "string", "pattern": "^pi_" }, "object": { "type": "string", "const": "payment_intent" }, "amount": { "type": "integer", "minimum": 1 }, "currency":{ "type": "string", "minLength": 3, "maxLength": 3 }, "status": { "type": "string", "enum": [ "потрібен_спосіб_оплати", "потрібне_підтвердження", "обробка", "успішно_здійснено", "скасовано" ]} }, "required": ["id", "object", "amount", "currency", "status"], "additionalProperties": false }
- ідентифікатор має починатися з "pi_"
- об'єкт має завжди бути «payment_intent»
- кількість має бути цілим числом, більшим або рівним 1
- валюта повинна бути рядком з трьох літер (наприклад, «usd», «eur»)
- статус повинен бути одним із зазначених значень
Переваги
- Раннє виявлення помилок: Вчасно виявляйте критичні зміни в API або неповні дані до того, як вони вплинуть на вашу бізнес-логіку.
- Автоматизоване тестування: Використовуйте схеми в CI/CD пайплайнах для валідації реальних і тестових відповідей.
- Узгодженість між командами: Стандартизуйте контракти даних між фронтендом, бекендом та сторонніми API.
Коректна перевірка JSON — включаючи як синтаксис, так і схему — запобігає непомітним помилкам, забезпечує дотримання найкращих практик і захищає ваші додатки від некоректних або зловмисних даних. Незалежно від того, чи використовується вона в конфігураційних файлах, API-запитах чи обміні повідомленнями між сервісами, надійна валідація є основою сучасних програмних систем.
Конфіденційність і безпека
Усі перевірки валідності та схеми виконуються локально у вашому браузері. Жодні дані не завантажуються та не зберігаються. Ваш JSON залишається повністю приватним.
Приклади коду для валідації JSON
Дізнайтеся, як перевіряти JSON у різних мовах програмування за допомогою вбудованих бібліотек або популярних фреймворків. Ці приклади демонструють як синтаксичну перевірку, так і валідацію за схемою.
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
const Ajv = require("ajv");
const ajv = new Ajv();
const schema = { type: "object", properties: { age: { type: "integer" } }, required: ["age"] };
const data = { age: 30 };
const validate = ajv.compile(schema);
console.log(validate(data) ? "Valid!" : ajv.errorsText(validate.errors));
import json
try:
obj = json.loads('{"name":"Alice","age":30}')
print("Valid JSON:", obj)
except json.JSONDecodeError as e:
print("Invalid JSON:", e)
import json, jsonschema
schema = {
"type": "object",
"properties": { "age": { "type": "integer" } },
"required": ["age"]
}
data = {"age": 30}
try:
jsonschema.validate(data, schema)
print("Valid!")
except jsonschema.ValidationError as e:
print("Schema validation error:", e)
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`{"name":"Alice","age":30}`)
var obj map[string]interface{}
if err := json.Unmarshal(data, &obj); err != nil {
fmt.Println("Invalid JSON:", err)
} else {
fmt.Println("Valid JSON:", obj)
}
}
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String json = "{"name":"Alice","age":30}";
try {
Object obj = new ObjectMapper().readTree(json);
System.out.println("Valid JSON: " + obj);
} catch (Exception e) {
System.out.println("Invalid JSON: " + e.getMessage());
}
}
}
using System;
using System.Text.Json;
class Program {
static void Main() {
string json = "{"name":"Alice","age":30}";
try {
var doc = JsonDocument.Parse(json);
Console.WriteLine("Valid JSON!");
} catch (JsonException e) {
Console.WriteLine("Invalid JSON: " + e.Message);
}
}
}
<?php
$json = '{"name":"Alice","age":30}';
$obj = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
echo "Valid JSON";
} else {
echo "Invalid JSON: " . json_last_error_msg();
}
require 'json'
begin
obj = JSON.parse('{"name":"Alice","age":30}')
puts "Valid JSON!"
rescue JSON::ParserError => e
puts "Invalid JSON: #{e.message}"
end
echo '{"name":"Alice","age":30}' | jq empty && echo "Valid" || echo "Invalid"
fn main() {
let data = r#"{"name":"Alice","age":30}"#;
match serde_json::from_str::<serde_json::Value>(data) {
Ok(_) => println!("Valid JSON!"),
Err(e) => println!("Invalid JSON: {}", e),
}
}
import org.json.JSONObject
fun main() {
try {
val obj = JSONObject("{\"name\":\"Alice\",\"age\":30}")
println("Valid JSON: $obj")
} catch (e: Exception) {
println("Invalid JSON: ${e.message}")
}
}
import Foundation
let json = "{\"name\":\"Alice\",\"age\":30}"
if let data = json.data(using: .utf8) {
do {
let _ = try JSONSerialization.jsonObject(with: data)
print("Valid JSON!")
} catch {
print("Invalid JSON: \(error)")
}
}
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
SELECT '{"name":"Alice","age":30}'::jsonb; -- Will error if not valid JSON
SELECT JSON_VALID('{"name":"Alice","age":30}');
$json = '{"name":"Alice","age":30}'
try {
$obj = $json | ConvertFrom-Json
Write-Output "Valid JSON!"
} catch {
Write-Output "Invalid JSON: $($_.Exception.Message)"
}
use JSON;
my $str = '{"name":"Alice","age":30}';
eval { decode_json($str) };
print $@ ? "Invalid JSON: $@" : "Valid JSON!";
import 'dart:convert';
void main() {
const jsonString = '{"name":"Alice","age":30}';
try {
final obj = jsonDecode(jsonString);
print('Valid JSON: $obj');
} catch (e) {
print('Invalid JSON: $e');
}
}
json = ~s({"name":"Alice","age":30})
case Jason.decode(json) do
{:ok, _} -> IO.puts("Valid JSON!")
{:error, err} -> IO.puts("Invalid JSON: #{err}")
end
import play.api.libs.json._
object Main extends App {
val str = """{"name":"Alice","age":30}"""
try {
val json = Json.parse(str)
println("Valid JSON!")
} catch {
case e: Exception => println("Invalid JSON: " + e.getMessage)
}
}
Про цей інструмент
Цей інструмент розроблено командою Itself Tools, творцями широкого спектру швидких, орієнтованих на конфіденційність онлайн-утиліт, якими користуються мільйони по всьому світу. Маючи багаторічний досвід у створенні браузерних інструментів, що ставлять у пріоритет простоту, швидкість і надійність, ми розширилися в напрямку додатків для розробників, як цей — створений, щоб полегшити технічні завдання програмістам, аналітикам і цифровим фахівцям.