Blog JSystems - z miłości do programowania

Przetwarzanie danych JSON



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]}


 


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!