jsonrepair (CZ článek)

Back to blog

Jak opravit rozbitý JSON bez stresu (JS i Python)

4 min read
Table of Contents

Všichni, co vyvíjí webové aplikace a hlavně backenďáci, znají moc dobře chybu jako je tato:

SyntaxError: JSON.parse: unexpected character at line 1 column 26 of the JSON data

jsonrepair je malý, ale mocný nástroj, který se snaží opravit poškozený nebo neplatný JSON tak, aby šel znovu správně načíst. Tady jsou odkazy na dokumentaci, na blogový článek autora, na github a na webový nástroj k vyzkoušení.

Popis a vlastnosti jsonrepair

Nástroj analyzuje neplatný JSON řetězec a zkusí ho transformovat na validní formát. Opravuje např. následující problémy:

  • chybějící uvozovky kolem klíčů
  • nadbytečné čárky nebo chybějící čárky
  • špatné nebo chybějící závorky
  • nevalidní uvozovky – například ‘text’"text"
  • nahradit JS konstanty undefined, NaN, Infinity za platné JSON hodnoty
  • nahradit Python konstanty None, True, False za platné JSON hodnoty
  • komentáře a jiný ne-JSON syntax (např. z JS objektů)
  • odstranit escape znaky ze stringů nebo opravit nesprávně zalomené řetězce
  • převést jednořádkový JSON s newline znaky na validní pole objektů

Jak začít

Instalace přes npm:

npm install jsonrepair

Použití v Node.js:

import { jsonrepair } from 'jsonrepair';

const brokenJson = `
{
  name: 'Pizzeria Roma',
  address: "Main Street 123",
}`;

const fixed = jsonrepair(brokenJson);
// '{
//   "name": "Pizzeria Roma",
//   "address": "Main Street 123",
//  }'

Použití v CLI:

jsonrepair broken.json > fixed.json

Použití v Pythonu pomocí PythonMonkey

jsonrepair je možné použít přímo v Python pomocí balíčku PythonMonkey, který umožňuje spouštět JavaScript kód v Pythonu.

npm install jsonrepair
pip install pythonmonkey
# repair.py

import pythonmonkey

jsonrepair = pythonmonkey.require('jsonrepair').jsonrepair

json = "[1,2,3,"
repaired = jsonrepair(json)
print(repaired)
# Výstup: [1,2,3]

Příklady oprav

Klasické problémy

{
  name: "Test", // komentář
  id: NaN,
}
{
  "name": "Test",
  "id": null
}

JSONP obal

callback({
  "id": 1,
  "name": "Pepa"
});
{
  "id": 1,
  "name": "Pepa"
}

Více JSON objektů oddělených novými řádky

{ "id": 1, "name": "Anna" }
{ "id": 2, "name": "Tomáš" }
[
  { "id": 1, "name": "Anna" },
  { "id": 2, "name": "Tomáš" }
]

MongoDB formát

{
  "_id": ObjectId("5f43a1b2e4d1c4a3f0a7f123"),
  "created": ISODate("2022-10-12T12:00:00Z"),
  "value": NumberLong(100)
}
{
  "_id": "5f43a1b2e4d1c4a3f0a7f123",
  "created": "2022-10-12T12:00:00Z",
  "value": 100
}

Výhody

  • Opraví běžné chyby bez ručního ladění
  • Skvělé pro debugování nebo automatické opravy vstupních dat
  • Lze integrovat do testů, CI nástrojů, formulářů apod.
  • Malý a čistý balíček s nulovými závislostmi

Omezení a nevýhody

  • Neopraví vše – pokud je vstup extrémně rozbitý, může selhat
  • Automatická oprava nemusí vždy odpovídat původnímu záměru – jsonrepair sice vytvoří validní JSON, ale výsledek může být jiný, než co bylo původně zamýšleno
  • Mělo by se používat spíše pro ladění nebo vizualizaci

Příklady integrace jsonrepair do většího software

  • při ladění response z API, která vrací špatný JSON
  • při parsování uživatelských vstupů
  • ve vývojářských nástrojích nebo editorech
  • v CI pipeline – automatická oprava JSON logů před zpracováním

Závěr

jsonrepair je užitečný nástroj pro automatickou opravu syntakticky neplatného JSON formátu. Umožňuje jednoduše transformovat chybové nebo nedokončené JSON vstupy na validní struktury, které lze dále zpracovávat.

Alternativní balíček je napr. https://github.com/RyanMarcus/dirty-json