JSON ja Python: täielik juhend algajatele

1. Mis on JSON? (Põhiteadmised)

JSON-i ülevaade

JSON (JavaScript Object Notation) on andmevorming, mida kasutatakse sageli kliendi ja serveri vahelises suhtluses. See on kerge, loetav ja lihtsa struktuuriga, mistõttu kasutatakse seda laialdaselt veebirakendustes ja mobiilirakendustes. JSON on tekstipõhine formaat, mida saab hõlpsasti töödelda igas programmeerimiskeeles, muutes selle väga universaalseks.

JSON-i põhiline struktuur

JSON esitab andmeid võtme-väärtuse paaridena. Näiteks on olemas järgmine JSON-i struktuur:

{
  "nimi": "Sato",
  "vanus": 30,
  "huvid": ["lugemine", "film"]
}

Selles näites on nimi string, vanus number ja huvid massiiv. Tänu lihtsale struktuurile ja heale loetavusele on andmete vahetamine väga tõhus.

JSON-i eelised

  1. Kerge ja tõhus: Tekstipõhine formaat vähendab andmeedastuse mahtu ja vähendab seega võrgu koormust.
  2. Kõrge ühilduvus: Toetatud peaaegu kõigis programmeerimiskeeltes ja kasutatav mitmel platvormil.
  3. Lihtne töödelda: Andmete lugemine ja kirjutamine on lihtne, eriti API suhtluses.

2. JSON-i kasutamine Pythonis (põhialused)

Pythoni json moodul

Pythonis saab json mooduli abil hõlpsasti JSON-andmeid lugeda ja kirjutada. Näiteks saab JSON-andmed teisendada Pythoni sõnastikuks funktsiooni json.loads() abil.

import json

json_data = '{"nimi": "Sato", "vanus": 30}'
python_obj = json.loads(json_data)

print(python_obj)  # {'nimi': 'Sato', 'vanus': 30}

Vastupidises suunas saab Pythoni objektid JSON-vormingusse teisendada funktsiooni json.dumps() abil.

python_obj = {"nimi": "Sato", "vanus": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)

print(json_data)  # {"nimi": "Sato", "vanus": 30}

Failide lugemine ja kirjutamine

JSON-andmeid saab lugeda failist või kirjutada faili.

# Lugemine failist
with open('data.json', 'r') as f:
    data = json.load(f)

# Kirjutamine faili
with open('data.json', 'w') as f:
    json.dump(python_obj, f, ensure_ascii=False)

3. JSON-i kasutamine API suhtluses (praktika)

API suhtlus requests mooduliga

requests mooduli abil saab JSON-andmeid API kaudu lihtsalt saata ja vastu võtta. Allpool on näide POST-päringust JSON-andmete saatmiseks ja vastuse saamiseks.

POST-päring JSON-andmete saatmiseks

import requests

url = 'https://example.com/api'
data = {'nimi': 'Sato', 'vanus': 30}

response = requests.post(url, json=data)
json_response = response.json()

print(json_response)

GET-päring JSON-andmete saamiseks

GET-päringuga saab API-st JSON-andmeid hõlpsasti kätte.

response = requests.get('https://example.com/api/user/1')
data = response.json()

print(data)

 

4. Vigade käitlemine ja parimad tavad

Vigade käitlemine API suhtluses

Kui API suhtluse käigus tekib viga, on oluline vigade käsitlemine. Järgmises näites püütakse kinni võrgu- ja ajalõpivead.

try:
    response = requests.post(url, json=data)
    response.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print("Http Error:", errh)
except requests.exceptions.ConnectionError as errc:
    print("Error Connecting:", errc)
except requests.exceptions.Timeout as errt:
    print("Timeout Error:", errt)
except requests.exceptions.RequestException as err:
    print("OOps: Something Else", err)

Uuesti proovimine (Retry)

Kui võrk on ebastabiilne, on oluline rakendada uuesti proovimise loogikat. requests moodul pakub selleks lihtsat lahendust Retry klassiga.

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

response = session.get(url)

5. JSON-i valideerimine

Valideerimine jsonschema abil

API-st saadud JSON-andmete vastavust ootuspärasele struktuurile saab kontrollida jsonschema teegi abil.

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "nimi": {"type": "string"},
        "vanus": {"type": "number"}
    },
    "required": ["nimi", "vanus"]
}

json_data = {"nimi": "Sato", "vanus": 30}

try:
    validate(instance=json_data, schema=schema)
    print("JSON is valid")
except ValidationError as e:
    print("Validation Error:", e)

See töötab ka keerukamate skeemide ja pesastatud objektidega, võimaldades API-andmeid kindlalt valideerida.

6. Turvalisuse parimad tavad

API võtmete haldus

API võtmeid ei tohiks kõvakodeerida lähtekoodi sisse, vaid neid tuleks hallata keskkonnamuutujate kaudu. See vähendab turvariske.

import os

api_key = os.getenv('API_KEY')

Andmete sanitiseerimine

Enne kasutaja sisestatud andmete serverisse saatmist tuleks need sanitiseerida, et vältida SQL-süstimist ja XSS-ründeid.

from html import escape

safe_data = escape(user_input)