Přehled
| JSON | JavaScript | Python | PHP | Java (Jackson) | C# (System.Text.Json) | Go | Rust (serde_json) |
|---|---|---|---|---|---|---|---|
| objekt | Object | dict | stdClass; s assoc=true array | LinkedHashMap; strom ObjectNode | JsonElement (Object); JsonObject | map[string]any | Value::Object (Map) |
| pole | Array | list | array | ArrayList; strom ArrayNode | JsonElement (Array); JsonArray | []any | Value::Array (Vec) |
| řetězec | string | str | string | String; strom TextNode | JsonElement (String); JsonValue | string | Value::String |
| celé číslo | number (double) | int, libovolně velké | int; nad PHP_INT_MAX float | Integer, Long, BigInteger | JsonElement (Number): GetInt64(), GetDecimal()… | float64; s UseNumber() json.Number | Value::Number (i64, u64) |
| desetinné číslo, exponent | number (double) | float | float | Double; volitelně BigDecimal | JsonElement (Number): GetDouble(), GetDecimal() | float64 | Value::Number (f64) |
| true / false | boolean | bool | bool | Boolean; strom BooleanNode | JsonElement (True/False); JsonValue | bool | Value::Bool |
| null | null | None | null | null; strom NullNode | null | nil | Value::Null |
Postup a příklady najdeš v související výukové kapitole. Při implementaci ověř také verzi procesoru a primární specifikaci uvedenou pod tabulkou. Všechny referenční tabulky na jedné stránce s filtrem jsou v taháku XML a JSON.
Co se při převodu změní
JSON zná jen šest druhů hodnot a o přesnosti čísel ani o pořadí klíčů nic neříká. Každý jazyk je proto mapuje po svém. Všechny řádky níže jsou výsledek čtení tohoto vstupu:
{"obj":{"b":1,"a":2,"10":3,"2":4},"big":12345678901234567890,"exp":1e2,"dup":1,"dup":2} | Co | Kde se to stane | Jak tomu předejít |
|---|---|---|
| velké celé číslo 12345678901234567890 | JavaScript vrátí 12345678901234567000, PHP a Go float 1.2345678901234567E+19. Přesně ho přečte Python (int), Jackson (BigInteger), C# přes GetDecimal() (GetInt64() vyhodí InvalidOperationException) a serde_json až do u64::MAX. | velká ID posílej jako řetězec; v PHP JSON_BIGINT_AS_STRING, v Go Decoder.UseNumber() |
| pořadí klíčů b, a, 10, 2 | JavaScript dá celočíselné klíče dopředu (2, 10, b, a). Go při zápisu mapy klíče seřadí (10, 2, a, b), serde_json bez funkce preserve_order už při čtení. Python, PHP, Jackson a C# pořadí zachovají. | na pořadí členů nespoléhej (RFC 8259 § 4); záleží-li na něm, použij pole |
| celé, nebo desetinné číslo | Go čte každé číslo jako float64. Zápis 1e2 je v Pythonu float 100.0 a v Jacksonu Double, i když je hodnota celá. | typ urči schématem nebo cílovou třídou, ne podle zápisu čísla |
| prázdný objekt a číselné klíče v PHP | S json_decode(…, true) se {} zapíše zpátky jako [] a {"0":"a","1":"b"} jako ["a","b"]; klíče "10" a "2" se stanou celými čísly. | pro data, která zapisuješ zpět, nech výchozí stdClass (ten {} zachová) |
| duplicitní klíč dup | JavaScript, Python, PHP, Go, Jackson a JsonSerializer v C# vrátí poslední hodnotu 2. JsonNode v C# vyhodí ArgumentException až při přístupu k objektu. | chybu zapneš v C# volbou AllowDuplicateProperties = false, v Jacksonu STRICT_DUPLICATE_DETECTION |
| obecný objekt v C# | JsonSerializer.Deserialize<object>() vrací JsonElement, ne slovník; také hodnoty v Dictionary<string, object> jsou JsonElement. | deserializuj do vlastní třídy, nebo pracuj s JsonNode |
Jak se s čísly zachází obecně, popisuje kapitola Čísla v JSON. Čtení a zápis v konkrétním jazyce najdeš v sekci Programování.