Blog JSystems - uwalniamy wiedzę!

Szukaj

JSON w Pythonie, w skrócie

Konwersja tekst <-> słownik:

import json
dane = json.loads('{"id": 1}')   # tekst -> slownik
tekst = json.dumps(dane)             # slownik -> tekst
JSON i słownik Pythona - konwersja
json.dumps zamienia słownik na tekst JSON; json.loads wczytuje JSON z powrotem na słownik

JSON to obecnie bardzo popularny format danych, wciąż zyskujący na popularności. Zyskuje kosztem formatu XML który jest coraz częściej zastępowany przez JSON. Wykorzystywany jest do przechowywania danych, ale również do komunikacji między aplikacjami jako format uniwersalny. Niezależnie od tego skąd dane będą pochodzić, czy będą pobierane z pliku czy np. z usługi sieciowej, sposób jego przetwarzania w Pythonie jest taki sam. Poniżej przedstawiam dane które będę wykorzystywał w przykładach tego rozdziału. Dane w przykładach zawsze będą znajdowały się w pliku dane.json

dane={
  "imie":"Andrzej",
  "nazwisko": "Klusiewicz",
  "adres": {
    "miasto": "Warszawa",
    "kod": "02-019"
  },
  "jezyki": ["polski","angielski","Java","R","Python","PL/SQL"]
}

Ładowanie danych JSON z pliku

W przykładach będę używał danych umieszczonych w pliku. Do wygodnej zabawy z tym formatem użyję modułu "json". Natywne metody odczytu pliku nie byłyby zbyt użyteczne przy tym formacie danych. Moduł "json" posiada funkcję "load", która przyjmuje zmienną reprezentującą otwarty plik, a zwraca dane w postaci słownika.

import json
plik=open('dane.json',encoding='utf-8')
obj=json.load(plik)
print(obj)
print(type(obj))
plik.close()

Po uruchomieniu powyższego kodu na konsoli zobaczymy:

{'imie': 'Andrzej', 'nazwisko': 'Klusiewicz', 'adres': {'miasto': 'Warszawa', 'kod': '02-019'}, 'jezyki': ['polski', 'angielski', 'Java', 'R', 'Python', 'PL/SQL']}
<class 'dict'>

Jak widzimy po informacji zwracanej przez funkcję "type", jest to zwyczajny słownik, taki z jakim już się wcześniej spotkaliśmy. Skoro tak, to dane możemy teraz przetwarzać tak samo jak każdy inny słownik. Sięgnijmy zatem do wartości elementu znajdującego się pod kluczem "imie":

print(obj['imie'])

Na konsoli zobaczymy:

Andrzej

Możemy znanymi nam już metodami przeiterować i wyświetlić np wszystkie klucze:

for k in obj.keys():
    print(k)

Wynik na konsoli:

imie
nazwisko
adres
jezyki

Wszystkie poznane w rozdziale o słownikach metody przetwarzania tego formatu danych mają tu zastosowanie. Co jednak w przypadku bardziej złożonych struktur? Przypomnijmy zawartość pliku:

{
  "imie":"Andrzej",
  "nazwisko": "Klusiewicz",
  "adres": {
    "miasto": "Warszawa",
    "kod": "02-019"
  },
  "jezyki": ["polski","angielski","Java","R","Python","PL/SQL"]
}

Wartością klucza "adres" jest struktura złożona. Czyli wartość dla klucza "adres" to kolejny słownik. Chciałbym teraz wydłubać nazwę miasta:

print(  obj['adres']['miasto']  )

Czyż Python nie jest piękny? A co jeśli chciałbym przeiterować po wszystkich językach i je wyświetlić na konsoli?

for j in obj['jezyki']:
    print(j)

Wynik na konsoli:

polski
angielski
Java
R
Python
PL/SQL

Mogłem tak zrobić, ponieważ zbiór "języki" jest zwracany jako lista. Skoro tak, to również mogę odwoływać się do poszczególnych języków po ich pozycji na liście:

print(obj['jezyki'][2])

Zwróci nam element o indeksie 2 (czyli pozycji trzeciej) z listy języków tj. "Java".

Tworzenie i zapisywanie danych JSON do pliku

Skoro już wiemy że dane odczytywane jako JSON są zwracane pod postacią pythonowego słownika, to naturalną konsekwencją zapis będzie się odbywał dokładnie odwrotnie tj tworzymy słownik i zrzucamy do pliku. Możemy to zrobić na dwa sposoby. Wybór metody to kwestia wygody użycia, co kto lubi jak komu wygodnie bo efekt jest ten sam. Sposób pierwszy:

import json
obj=dict()
obj['ksiazka']='Finansowy Ninja'
obj['film_na_wieczor']='https://www.youtube.com/watch?v=sCNrK-n68CM'
obj['banknoty']=[10,20,50,100,200,500]
plik=open('jsonout.json',encoding='utf-8',mode="w")
json.dump(obj,plik)
plik.close()

Tworzę pythonowy słownik klucz po kluczu i przypisuję do każdego klucza wartości. Funkcja "dump" z modułu "json" zapisuje słownik w postaci formatu JSON do pliku podanego przez zmienną do drugiego parametru.

Alternatywnie mogę po prostu ręcznie zadeklarować sobie słownik i zainicjalizować go danymi pisanymi jako całość:

import json
dane={
    "ksiazka": "Finansowy Ninja",
    "film_na_wieczor": "https://www.youtube.com/watch?v=sCNrK-n68CM",
    "banknoty": [10,20,50,100,200,500]
}
plik=open('jsonout2.json',encoding='utf-8',mode="w")
json.dump(dane,plik)
plik.close()

W obu przypadkach zawartość pliku wyjściowego jest taka sama:

{"ksiazka": "Finansowy Ninja", "film_na_wieczor": "https://www.youtube.com/watch?v=sCNrK-n68CM", "banknoty": [10, 20, 50, 100, 200, 500]}
Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym różni się json.dumps od json.loads?
json.dumps zamienia pythonowy słownik na tekst w formacie JSON, a json.loads robi odwrotnie, czyli wczytuje tekst JSON z powrotem na słownik. Pierwsza funkcja służy do zapisu i wysyłki danych, druga do ich odczytu.
Jak wczytać dane JSON bezpośrednio z pliku?
Otwórz plik funkcją open, a następnie przekaż uchwyt do funkcji json.load z modułu json. Zwróci ona dane w postaci słownika. Do zapisu słownika do pliku użyjesz analogicznie funkcji json.dump.
W jakiej strukturze danych Python trzyma wczytany JSON?
Wczytany JSON staje się zwykłym słownikiem, co potwierdza funkcja type zwracająca klasę dict. Dzięki temu przetwarzasz go tak samo jak każdy inny słownik, sięgając po wartości przez klucze i iterując po nich.
Jak dostać się do zagnieżdżonych danych w JSON?
Do wartości zagnieżdżonego słownika sięgasz łańcuchem kluczy, na przykład obj[adres][miasto]. Jeśli pod kluczem jest lista, odwołujesz się do jej elementów po indeksie albo iterujesz po niej pętlą, tak jak po zwykłej liście.
Dlaczego JSON wypiera format XML?
JSON jest lżejszy, bardziej czytelny i wygodniejszy w obsłudze, dlatego zyskuje popularność kosztem XML. Używa się go do przechowywania danych oraz do komunikacji między aplikacjami jako format uniwersalny, niezależny od źródła danych.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...