Znění hlášky v jednotlivých prostředích
Python ve výchozím nastavení NaN přijme, ačkoli to RFC 8259 nepovoluje. Data,
která Python bez potíží načte, proto může jiný parser odmítnout.
Příčiny a opravy
Úvodní nula
{"pocet":1}
Další neplatné zápisy jsou +1, .5 a 1.. Identifikátor
s úvodními nulami přenes jako řetězec (viz níže).
Desetinná čárka místo tečky
{"cena":12.50}
Parser přečte 12, čárku vezme jako oddělovač položek a za ní čeká název další
vlastnosti v uvozovkách. Proto hláška mluví o názvu vlastnosti, ne o čísle. JSON používá
desetinnou tečku bez ohledu na jazyk uživatele. Oprav export, ne plošným nahrazením čárek,
které patří i do textu.
NaN (stejně tak Infinity)
{"pomer":null}
JSON nemá hodnoty pro NaN ani nekonečno. Chybějící nebo nepočitatelnou hodnotu přenes jako
null nebo pole vynech. V Pythonu zapni kontrolu na obou stranách:
import json
def odmitni(nazev):
raise ValueError(f"{nazev} není platné číslo JSON")
json.loads('{"pomer":NaN}') # {'pomer': nan}, bez chyby
json.loads('{"pomer":NaN}', parse_constant=odmitni) # ValueError: NaN není platné číslo JSON
json.dumps({"pomer": float("nan")}) # '{"pomer": NaN}', neplatný JSON
json.dumps({"pomer": float("nan")}, allow_nan=False) # ValueError: Out of range float values … Je údaj číslo, nebo identifikátor?
U množství znamená 01 obvykle číslo 1; u kódu výrobku mohou být úvodní nuly součástí
identifikátoru. V takovém případě je správná oprava řetězec "01", nikoli
odstranění nuly. Nejdřív zjisti význam pole a pravidla příjemce.
Platné číslo 1e+2 znamená 100: plus je povolené u exponentu, ale ne před celým
číslem. Číslo 1e400 má správný zápis JSON, přesto může překročit rozsah cílového typu. Platná
syntaxe nezaručuje ani přesnost: velká celá čísla mohou po načtení ztratit číslice. Další
rozdíly popisuje kapitola Čísla v JSON.