fbpx

Format JSON, który zagości na kartach bloga, to temat niezwykle lekki i przyjemny. Format, który staje się powoli kultowy, często używany w memach i śmiesznych filmach ze świata IT. I wcale nie trzeba daleko szukać, bo któż z nas nie kojarzy Zbigniewa Jsona z kanału HRejterzy!

Na pierwszy rzut oka format JSON wygląda brzydko, jednak jego lekkość i praca z nim to czysta przyjemność. Pozwolę sobie odpowiedzieć na następujące pytania:

  • Czym jest format JSON i co oznacza ten akronim?
  • Do czego służy?
  • Jak wygląda składnia?
  • W jaki sposób go używać?

Cztery pytania postawione, więc czas brać się do pracy!

Format JSON – wprowadzenie

Zacznijmy od rozszyfrowania akronimu. JSON to skrót od JavaScript Object Notation, co w wolnym tłumaczeniu oznacza Notacja Obiektowa JavaScriptu. I nie da się ukryć, format JSON wywodzi się z języka JS i jest tam głównym nośnikiem informacji, jednak niech Was nie zmyli jego pochodzenie. Używany jest aktualnie w niemal każdym wysokopoziomowym języku programowania. Sprawia to, że jest on niezależny od języka programowania.

Format JSON ma już swoje lata, ponieważ powstał na początku XXI wieku, a dokładnie w roku 2001. Twórcą oficjalnie uznawany jest amerykański programista Douglas Crockford. Jest to jedna z osobowości, wokół której rozwijał się ówczesny JS.

Według definicji JSON to lekki format danych służący do wymiany danych między systemami oraz przechowywania w tym formacie niektórych informacji konfiguracyjnych systemu. Wszystko to dzieje się za pomocą plików tekstowych z rozszerzeniem (kto by się spodziewał) .json.

Wartym uwagi jest jeszcze fakt, że plik JSON zawiera jedynie dane w ściśle uporządkowany sposób — za pomocą pól klucz i wartość. Nie ma tam dostępnych funkcji czy zmiennych. Ten fakt mocno wpływa na prostotę formatu.

Składnia

Czym byłby ten artykuł bez omówienia składni JSONa. Zakładam się, że nawet jeżeli nie programujesz, to miałeś/aś możliwość w wielu miejscach zobaczenia tego tworu.

Obiektem przechowywanym w pliku JSON może być cokolwiek. Pierwsze, na co trzeba zwrócić uwagę to nawiasy klamrowe {}. One są podstawowym znacznikiem w formacie JSON. Rozpoczynają i kończą każdy blok danych.

Poniżej w nawiasach mamy dwie dane, po pierwsze imię, które oznaczone jest kluczem firstName. Druga dana to nazwisko oznakowane kluczem lastName. Zwróć, proszę uwagę na to, że zarówno klucze, jak i wartości, czyli Mateusz Rus znajdują się w cudzysłowie. 

Klucz i wartość oddzielona jest dwukropkiem, natomiast każde pole od siebie oddziela przecinek. 

{
    "firstName" : "Mateusz",
    "lastName" : "Rus"
}

Skomplikujmy odrobinę składnię i zobaczmy prawdziwe oblicze formatu JSON! Bardzo mocną zaletą jest to, że możemy budować wewnątrz pliku JSON obiekty. Zagnieżdżać elementy i identyfikować je za pomocą identyfikatora — zazwyczaj w formie specjalnego ciągu znaków nazywanych GUIDem.

To, co na pierwszy rzut oka widać, to obiekt passions, który objęty jest nawiasami kwadratowymi []. W obiekcie tym dodane są trzy zagnieżdżone elementy, które posiadają unikalne ID. Warto w tym miejscu jeszcze wspomnieć o tworzeniu nazw, czyli zaczynamy klucz od małej litery, stosujemy tak zwaną notację camelCase (inaczej notacja wielbłądzia), która polega na tym, by zmienne tworzyć w jednym ciągu, a każdą pierwszą literę kolejnego wyrazu rozpoczynamy dużą literą (toJestZmiennaCamelCase). Dodatkowo nazwa obiektu, która ma w sobie inne obiekty, powinna być nazwana w liczbie mnogiej, chociaż to akurat wydaje się logiczne.

{
   "firstName":"Mateusz",
   "lastName":"Rus",
   "passions":[
      {
         "id":"ebd5a3ba-0dc3-446f-a99e-5b2d065f91da",
         "name":"programowanie"
      },
      {
         "id":"e8855a53-d31d-4dd1-b2c8-38e069463604",
         "name":"sport"
      },
      {
         "id":"aabeb531-3a67-4411-8630-25db04431c33",
         "name":"książki"
      }
   ]
}

Format JSON – implementacja

No i pięknie, teoretycznie mamy omówione już wszystko. Teraz czas przejść do kilku skryptów, które pokażą nam możliwości i zastosowania formatu JSON. 

Zajmiemy się serializacją i deserializacją obiektu w języku Python. Jest to podstawowa operacja, którą wykonuje się podczas pracy z JSON. Po pierwsze musimy dodać do programu bibliotekę json. Następnie przygotować obiekt, który będziemy serializować do formatu JSON. Co ciekawe, zobacz, że już na tym etapie słownik w Python jest niemal identyczny z JSON! Przy okazji, o słownikach miałem okazję pisać w artykule numer 50.

Aby zserializować obiekt słownikowy do formatu JSON, musimy posłużyć się metodą dumps, która na wejście otrzyma słownik wraz z informacją o wielkości wcięć, a na wyjście poda nam wartość tekstową, która będzie gotowym JSON, którego możemy na przykład zapisać do pliku.

Deserializacja działa w odwrotną stronę — najpierw dostaje tekst w formacie JSON, a następnie tworzy z tego obiekt typu słownikowego. I tak kolejno w zmiennej jsonText przechowamy nasze dane w postaci zminifikowanej, czyli bez białych znaków typu spacja.

Teraz wystarczy użyć metody loads i cała praca zostanie wykonana za nas. Na wejście podajemy tekst, a na wyjściu otrzymamy obiekt, do którego możemy odwoływać się po kluczach. Dla przykładu pobrałem imię i nazwisko oraz wykonałem prostą pętlę, która wypisuje dane z obiektu zagnieżdżonego. Warto jeszcze zauważyć, że musiałem zastosować funkcję replace, która pojedynczy cudzysłów zamienia na podwójny. I tu mam zadanie dla Ciebie, jak można zapis z linii 54 zrobić optymalnie? 

# serializacja

import json
my_data = {
    "firstName": "Mateusz",
    "lastName": "Rus",
    "passions": [
        {
            "id": "ebd5a3ba-0dc3-446f-a99e-5b2d065f91da",
            "name": "programowanie"
        },
        {
            "id": "e8855a53-d31d-4dd1-b2c8-38e069463604",
            "name": "sport"
        },
        {
            "id": "aabeb531-3a67-4411-8630-25db04431c33",
            "name": "książki"
        }
    ]
}
json_data = json.dumps(my_data, indent=2)
print(json_data)

# {
#   "firstName": "Mateusz",
#   "lastName": "Rus",
#   "passions": [
#     {
#       "id": "ebd5a3ba-0dc3-446f-a99e-5b2d065f91da",
#       "name": "programowanie"
#     },
#     {
#       "id": "e8855a53-d31d-4dd1-b2c8-38e069463604",
#       "name": "sport"
#     },
#     {
#       "id": "aabeb531-3a67-4411-8630-25db04431c33",
#       "name": "ksi\u0105\u017cki"
#     }
#   ]
# }


# deserializacja
jsonText = '{"firstName":"Mateusz","lastName":"Rus","passions":[{"id":"ebd5a3ba-0dc3-446f-a99e-5b2d065f91da","name":"programowanie"},{"id":"e8855a53-d31d-4dd1-b2c8-38e069463604","name":"sport"},{"id":"aabeb531-3a67-4411-8630-25db04431c33","name":"książki"}]}'

jsonDeserialize = json.loads(jsonText)

print(jsonDeserialize["firstName"])
print(jsonDeserialize["lastName"])

for item in jsonDeserialize["passions"]:
    jsonDeserializePassion = json.loads(str(item).replace("'", '"'))
    print(jsonDeserializePassion["id"])
    print(jsonDeserializePassion["name"])

# Mateusz
# Rus
# ebd5a3ba-0dc3-446f-a99e-5b2d065f91da
# programowanie
# e8855a53-d31d-4dd1-b2c8-38e069463604
# sport
# aabeb531-3a67-4411-8630-25db04431c33
# książki

Format JSON – podsumowanie

Artykuł krótki, bo i format JSON to temat przyjemny. Warto samemu przećwiczyć możliwości formatu JSON. Celowo nie poruszałem tego zagadnienia w innych językach i z użyciem zewnętrznych narzędzi typu Postman, ponieważ na narzędzie chciałbym poświęcić osobny artykuł. Do tego artykułu będzie nam jeszcze potrzebna wiedza z zakresu formatu XML, więc mam co pisać!

Będę informować, gdy już się pojawią wspomniane zagadnienia. Na koniec jeszcze raz dam wskazówkę co do tego, by zwracać uwagę na detale. Po pierwsze poprawne nazewnictwo, po drugie cudzysłów ma znaczenie i po trzecie, rozmiar również ma znaczenie, dlatego warto czasami minifikować pliki, zwłaszcza te dużych rozmiarów!

PS. Będę wdzięczny za komentarze pod tym postem!

PS2. Czeka też na Ciebie prezent. Wystarczy, że zapiszesz się na Newsletter poniżej!

PS3. Dołącz do naszej grupy na Facebook!

PS4. Dołącz do naszego serwera na Discord!

Subskrybuj

Zapisz się na Newsletter, odbierz NAGRODĘ w postaci e-booka z 10 omówionymi algorytmami pojawiającymi się w pytaniach podczas REKRUTACJI.

Dodatkowo otrzymuj co niedzielę informacje na temat nowych wpisów, wiadomości ze świata IT i matematyki oraz ciekawych wydarzeniach. Nie przegap i dołącz już dziś do 419 osób!.
Autor

👨‍💻 .NET and Python programming passionate 🏦 Digtial Banking Solutions 🎓 Student 📊 Psychology 📚 Bookworm 🏠 Warsaw

1 Komentarz

  1. Hej Mateusz,

    Ja chciałbym się zapytać jaki format wymiany danych, XML czy JSON, byś był bardziej skłonny polecić, i dlaczego?

    Ja parę lat temu, no może dłużej 😄, pisałem aplikację ToDo w JS, ponieważ wtedy uczyłem się tego języka z książki.

    Do przechowywania danych użyłem właśnie formatu XML. Pamiętam że trochę było do ogarnięcia z tym ponieważ, nie wiem czy tak dalej jest, przy działaniu na plikach XML z JS, można natrafić na puste nodey i to trochę utrudnia pracę. Na pewno początkujący może zbaranieć dlaczego funkcja nie zwraca mu pożądanej wartości skoro wszystko dobrze selektował. A tu taki po prostu pusty node jest i co poradzić. Trzeba o tym pamiętać, ale nie wiem czy tak jeszcze jest.

    Chciałem jeszcze zapytać w jakich sytuacjach polecił byś, w produkcji, testowanie aplikacji na bazach danych np. SQLite3 a w jakich sytuacjach bardziej sprawdził by się JSON czy XML? Czy w ogóle to pytanie ma sens 😄?

    „I tu mam zadanie dla Ciebie, jak można zapis z linii 54 zrobić optymalnie? ” – przyznam się że nie wiem.

    Dzięki za fajny artykuł i pozdrawiam 👋.

Napisz komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Dołącz do naszego serwera Discord i rozmawiaj o programowaniu!

X