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"]
}
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".
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]}
Komentarze (0)
Brak komentarzy...