PyLadies Brno

JSON

Existují i jiné programovací jazyky než Python.
Ostatní jazyky neumí pracovat s Pythoními hodnotami. Budeme-li se chtít s takovými programy „domluvit” – předat jim nějaké informace ke zpracování, nebo od nich dostat výsledky – musíme informace předávat v nějaké zjednodušené podobě.

Typy

Většina programovacích jazyků má nějaká čísla, nějaký druh seznamů, nějakou odrůdu řetězců, a nějakou variaci na slovníky (nebo několik způsobů jak slovníky vytvořit). Dále má spousta jazyků způsob, jak zapsat True, False a None.
Tyhle základní typy většinou stačí na předání jakékoli informace v rozumně čitelné podobě, i když ne ve všech jazycích mají přesné ekvivalenty (třeba samotný Python má dva základní druhy čísel – int a float). Často se proto v komunikaci omezíme na ně.

Kódování dat

Další problém je přenos dat: abychom mohly informace zapsat na disk nebo přenést přes Internet, musíme je převést na sekvenci bytů (čísel od 0 do 255). Zjednodušeně řečeno, musíme je převést na řetězec.
Existuje spousta způsobů, jak zakódovat data. Každý způsob se snaží najít vhodnou rovnováhu mezi čitelností pro lidi/počítače, délkou zápisu, bezpečností, možnostmi a rozšířitelností. My už známe syntaxi Pythonu:
{
    'jméno': 'Anna',
    'město': 'Brno',
    'jazyky': ['čeština', 'angličtina', 'Python'],
    'věk': 26,
}
Jiný způsob zápisu dat je YAML:
jméno: Anna
město: Brno
jazyky:
  - čeština
  - angličtina
  - Python
věk: 26
Nebo třeba Bencode:
d6:jazykyl9:čeština11:angličtina6:Pythone4:věki26e6:město4:Brno6:jméno4:Annae
Existují i netextové formáty, jako Pickle 3:
}q(XjménoqXAnnaqXmÄtoqXBrnoqXjazykyq]q(X       ÄeÅ¡tinaqX
                                                          angliÄtinaXPythonq       eXvÄq
K▒u.
A nakonec uvedu JSON (z angl. Javascript Object Notation „zápis Javascriptových objektů”), který se pro svou jednoduchost rozšířil na Internetu nejvíc:
{
  "jméno": "Anna",
  "město": "Brno",
  "jazyky": ["čeština", "angličtina", "Python"],
  "věk": 26
}
Pozor na to, že ačkoli JSON vypadá podobně jako zápis v Pythonu, je to jiný formát s vlastními pravidly. Nezaměňuj je!

JSON v Pythonu

Kódování objektů v JSONu je jednoduché: existuje modul json, jehož metoda loads načte data z řetězce:
json_retezec = """
    {
      "jméno": "Anna",
      "město": "Brno",
      "jazyky": ["čeština", "angličtina", "Python"],
      "věk": 26
    }
"""

import json
data = json.loads(json_retezec)
print(data)
A pak tu je metoda dumps, která naopak daná data zakóduje, a vrátí řetězec:
>>> print(json.dumps(data))
{"v\u011bk": 26, "jm\u00e9no": "Anna", "jazyky": ["\u010de\u0161tina", "angli\u010dtina", "Python"], "m\u011bsto": "Brno"}
To, co vrátí jednoduché zavolání dumps(data) je vhodné pro počítačové zpracování; má-li výsledná data číst člověk, nastav ensure_ascii=True (aby se písmenka s diakritikou nekódovaly pomocí \) a indent=' ' (odsazení dvěma mezerami).
>>> print(json.dumps(data, ensure_ascii=False, indent='  '))
{
  "věk": 26,
  "jméno": "Anna",
  "jazyky": [
    "čeština",
    "angličtina",
    "Python"
  ],
  "město": "Brno"
}
Kompletní popis modulu json – včetně funkcí zápis/čtení přímo do/ze souborů – je v příslušné dokumentaci.