Znění hlášky v jednotlivých prostředích
Pozice v hlášce ukazuje na první znak za koncem prvního úplného dokumentu. PHP hlásí jen
obecné Syntax error, .NET popíše znak, který po hodnotě nečekal.
Příčiny a opravy
Dva dokumenty za sebou (JSON Lines čtené jako JSON)
[{"id":1},{"id":2}]
Soubory .jsonl a .ndjson, logy a exporty mívají jeden dokument na
řádek. Celý soubor tedy není JSON, ale posloupnost JSON textů. Čti ho po řádcích a každý
řádek parsuj zvlášť, nebo ze záznamů sestav pole, pokud příjemce chce jeden JSON.
// data.jsonl: jeden JSON dokument na řádek
const rows = text
.split('\n')
.filter((line) => line.trim() !== '')
.map((line) => JSON.parse(line)); import json
with open('data.jsonl', encoding='utf-8') as f:
rows = [json.loads(line) for line in f if line.strip()] Formát a jeho pravidla (UTF-8, konec řádku za každým záznamem) popisuje kapitola JSON Lines a NDJSON.
Jak najít příčinu
-
Podívej se, co stojí na hlášené pozici. Začíná tam
{nebo[, jde o další dokument; je tam}nebo], je v textu závorka navíc. - Je-li pozice na začátku druhého řádku, jsou to skoro jistě JSON Lines.
- U odpovědi API zkontroluj, jestli server neposílá víc objektů za sebou bez obalujícího pole, nebo jestli se k JSON nepřipojil další výstup (ladicí výpis, varování PHP).
Dokumenty spojené bez oddělovače ({"id":1}{"id":2}) rozdělí
v Pythonu json.JSONDecoder().raw_decode: vrátí první hodnotu a pozici, kde
skončila, a další dokument čteš od ní.
import json
decoder = json.JSONDecoder()
value, end = decoder.raw_decode('{"id":1}{"id":2}')
# value == {'id': 1}, end == 8: druhý dokument začíná na pozici 8