{"id":1354,"date":"2026-04-05T12:50:31","date_gmt":"2026-04-05T10:50:31","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1354"},"modified":"2026-04-20T12:55:26","modified_gmt":"2026-04-20T10:55:26","slug":"dane-z-api-w-formacie-json","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/05\/dane-z-api-w-formacie-json\/","title":{"rendered":"Dane z API w formacie JSON"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nowoczesne aplikacje bardzo rzadko dzia\u0142aj\u0105 w pe\u0142ni samodzielnie. System sprzeda\u017cowy pobiera kursy walut z zewn\u0119trznego serwisu, aplikacja mobilna odczytuje prognoz\u0119 pogody, panel administracyjny wy\u015bwietla dane u\u017cytkownik\u00f3w z osobnego backendu, a sklep internetowy synchronizuje stany magazynowe z hurtowni\u0105. W praktyce programista niemal codziennie pracuje z odpowiedziami zwracanymi przez interfejsy sieciowe. Najwi\u0119cej problem\u00f3w pojawia si\u0119 wtedy, gdy trzeba poprawnie odczyta\u0107 <strong>Dane z API w formacie JSON<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#dlaczego-dane-z-api-w-formacie-json-wymagaja-zrozumienia-struktury-i-typow-danych\">Dlaczego Dane z API w formacie JSON wymagaj\u0105 zrozumienia struktury i typ\u00f3w danych<\/a><\/li><li><a href=\"#jak-dziala-przeplyw-danych-od-zadania-http-do-obiektu-dostepnego-w-kodzie-programu\">Jak dzia\u0142a przep\u0142yw danych od \u017c\u0105dania HTTP do obiektu dost\u0119pnego w kodzie programu<\/a><\/li><li><a href=\"#jak-poprawnie-przetwarzac-dane-z-api-w-formacie-json-w-aplikacjach-backendowych-i-skryptach\">Jak poprawnie przetwarza\u0107 Dane z API w formacie JSON w aplikacjach backendowych i skryptach<\/a><ol><li><a href=\"#przyklad-w-python\">Przyk\u0142ad w Python<\/a><\/li><li><a href=\"#przyklad-w-c\">Przyk\u0142ad w C++<\/a><\/li><li><a href=\"#przyklad-w-c-1\">Przyk\u0142ad w C<\/a><\/li><li><a href=\"#przyklad-w-php\">Przyk\u0142ad w PHP<\/a><\/li><\/ol><\/li><li><a href=\"#walidacja-struktury-i-kontrola-poprawnosci-danych-zanim-trafia-do-logiki-biznesowej\">Walidacja struktury i kontrola poprawno\u015bci danych zanim trafi\u0105 do logiki biznesowej<\/a><\/li><li><a href=\"#praca-z-duzymi-odpowiedziami-i-paginacja-bez-przeciazania-pamieci-oraz-aplikacji\">Praca z du\u017cymi odpowiedziami i paginacj\u0105 bez przeci\u0105\u017cania pami\u0119ci oraz aplikacji<\/a><\/li><li><a href=\"#najczestsze-problemy-bledy-i-pulapki-podczas-pracy-z-systemami-wykorzystujacymi-dane-z-api-w-formacie-json\">Najcz\u0119stsze problemy, b\u0142\u0119dy i pu\u0142apki podczas pracy z systemami wykorzystuj\u0105cymi Dane z API w formacie JSON<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-json-jest-szybszy-od-xml\">Czy JSON jest szybszy od XML<\/a><\/li><li><a href=\"#czy-mozna-ufac-dokumentacji-api\">Czy mo\u017cna ufa\u0107 dokumentacji API<\/a><\/li><li><a href=\"#dlaczego-null-powoduje-tyle-problemow\">Dlaczego null powoduje tyle problem\u00f3w<\/a><\/li><li><a href=\"#czy-warto-zapisywac-pelne-odpowiedzi-z-api\">Czy warto zapisywa\u0107 pe\u0142ne odpowiedzi z API<\/a><\/li><li><a href=\"#czy-parser-json-zawsze-wykryje-problem\">Czy parser JSON zawsze wykryje problem<\/a><\/li><li><a href=\"#czy-paginacja-jest-konieczna\">Czy paginacja jest konieczna<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dlaczego-dane-z-api-w-formacie-json-wymagaja-zrozumienia-struktury-i-typow-danych\">Dlaczego Dane z API w formacie JSON wymagaj\u0105 zrozumienia struktury i typ\u00f3w danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JSON (JavaScript Object Notation) jest lekkim formatem zapisu danych tekstowych. Powsta\u0142 jako prosty spos\u00f3b wymiany informacji mi\u0119dzy systemami, ale dzi\u015b jest standardem praktycznie wsz\u0119dzie: REST API, webhooki, komunikacja frontend\u2013backend, integracje z p\u0142atno\u015bciami, systemy ERP, aplikacje mobilne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jego popularno\u015b\u0107 wynika z kilku powod\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jest czytelny dla cz\u0142owieka<\/li>\n\n\n\n<li>\u0142atwo parsuje si\u0119 go maszynowo<\/li>\n\n\n\n<li>obs\u0142uguj\u0105 go praktycznie wszystkie j\u0119zyki programowania<\/li>\n\n\n\n<li>dobrze nadaje si\u0119 do przesy\u0142ania danych przez HTTP<\/li>\n\n\n\n<li>ma prost\u0105 sk\u0142adni\u0119 bez nadmiaru formalizmu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze typy danych w JSON to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>obiekt (<code>{}<\/code>)<\/li>\n\n\n\n<li>tablica (<code>[]<\/code>)<\/li>\n\n\n\n<li>napis (<code>string<\/code>)<\/li>\n\n\n\n<li>liczba (<code>number<\/code>)<\/li>\n\n\n\n<li>warto\u015b\u0107 logiczna (<code>true<\/code>, <code>false<\/code>)<\/li>\n\n\n\n<li><code>null<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Prosty przyk\u0142ad odpowiedzi z serwera:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>JSON<\/td><td><code>json { \"id\": 15, \"name\": \"Jan Kowalski\", \"active\": true, \"roles\": [\"admin\", \"editor\"], \"address\": { \"city\": \"Warszawa\", \"zip\": \"00-001\" } }<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tutaj wyst\u0119puj\u0105 jednocze\u015bnie liczby, teksty, tablica oraz zagnie\u017cd\u017cony obiekt. To typowa sytuacja produkcyjna \u2014 realne odpowiedzi prawie nigdy nie s\u0105 p\u0142askie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kluczowe jest zrozumienie r\u00f3\u017cnicy mi\u0119dzy obiektem a tablic\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obiekt przechowuje pary klucz\u2013warto\u015b\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"name\": \"Anna\"<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tablica przechchowuje list\u0119 element\u00f3w:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[<br>  \"Anna\",<br>  \"Piotr\",<br>  \"Marek\"<br>]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0105d rozpoznania struktury powoduje p\u00f3\u017aniej klasyczne problemy: odwo\u0142anie do indeksu zamiast klucza albo odwrotnie. To jeden z najcz\u0119stszych powod\u00f3w awarii integracji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Warto te\u017c pami\u0119ta\u0107, \u017ce JSON nie posiada typu daty. Data zwykle przychodzi jako tekst:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"created_at\": \"2026-04-20T14:30:00Z\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To oznacza konieczno\u015b\u0107 r\u0119cznego parsowania po stronie aplikacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jak-dziala-przeplyw-danych-od-zadania-http-do-obiektu-dostepnego-w-kodzie-programu\">Jak dzia\u0142a przep\u0142yw danych od \u017c\u0105dania HTTP do obiektu dost\u0119pnego w kodzie programu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sam JSON nie pojawia si\u0119 znik\u0105d. Najpierw aplikacja wysy\u0142a \u017c\u0105danie HTTP:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GET<\/code> \u2014 pobranie danych<\/li>\n\n\n\n<li><code>POST<\/code> \u2014 utworzenie danych<\/li>\n\n\n\n<li><code>PUT<\/code> \/ <code>PATCH<\/code> \u2014 aktualizacja<\/li>\n\n\n\n<li><code>DELETE<\/code> \u2014 usuni\u0119cie<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Serwer odpowiada kodem statusu:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>200<\/td><td>operacja poprawna<\/td><\/tr><tr><td>201<\/td><td>utworzono zas\u00f3b<\/td><\/tr><tr><td>400<\/td><td>b\u0142\u0105d po stronie klienta<\/td><\/tr><tr><td>401<\/td><td>brak autoryzacji<\/td><\/tr><tr><td>404<\/td><td>nie znaleziono zasobu<\/td><\/tr><tr><td>500<\/td><td>b\u0142\u0105d serwera<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dopiero po poprawnym statusie zwykle analizujemy tre\u015b\u0107 odpowiedzi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad odpowiedzi HTTP:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>Response Body<\/td><td><code>json { \"status\": \"ok\", \"data\": { \"user_id\": 52, \"email\": \"user@example.com\" } }<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Najpierw nale\u017cy sprawdzi\u0107 status odpowiedzi, potem nag\u0142\u00f3wek <code>Content-Type<\/code>, a dopiero p\u00f3\u017aniej parsowa\u0107 tre\u015b\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce wiele b\u0142\u0119d\u00f3w wynika z za\u0142o\u017cenia, \u017ce odpowied\u017a zawsze ma poprawny format. Nie ma. API potrafi zwr\u00f3ci\u0107 HTML b\u0142\u0119du zamiast JSON, pust\u0105 odpowied\u017a albo komunikat serwisowy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego bezpieczna kolejno\u015b\u0107 wygl\u0105da tak:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>sprawdzenie kodu HTTP<\/li>\n\n\n\n<li>sprawdzenie typu odpowiedzi<\/li>\n\n\n\n<li>parsowanie tre\u015bci<\/li>\n\n\n\n<li>walidacja wymaganych p\u00f3l<\/li>\n\n\n\n<li>obs\u0142uga brak\u00f3w i warto\u015bci domy\u015blnych<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jak-poprawnie-przetwarzac-dane-z-api-w-formacie-json-w-aplikacjach-backendowych-i-skryptach\">Jak poprawnie przetwarza\u0107 Dane z API w formacie JSON w aplikacjach backendowych i skryptach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsza zasada: nie ufa\u0107 danym wej\u015bciowym.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi dokumentacja m\u00f3wi, \u017ce pole <code>price<\/code> zawsze jest liczb\u0105, to i tak trzeba za\u0142o\u017cy\u0107, \u017ce kiedy\u015b b\u0119dzie pustym stringiem albo <code>null<\/code>. Produkcja szybko uczy pokory.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-python\">Przyk\u0142ad w Python<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python import requests response = requests.get(\"https:\/\/api.example.com\/users\/15\") if response.status_code == 200: data = response.json() name = data.get(\"name\", \"brak\") print(name) else: print(\"B\u0142\u0105d:\", response.status_code)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>get()<\/code> jest bezpieczniejsze ni\u017c bezpo\u015brednie <code>data[\"name\"]<\/code>, bo nie ko\u0144czy programu wyj\u0105tkiem przy braku klucza.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-c\">Przyk\u0142ad w C++<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C++<\/td><td><code>cpp #include &lt;iostream&gt; #include &lt;nlohmann\/json.hpp&gt; using json = nlohmann::json; int main() { std::string text = R\"({\"name\":\"Anna\",\"age\":25})\"; json data = json::parse(text); std::cout &lt;&lt; data[\"name\"] &lt;&lt; std::endl; return 0; }<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ szczeg\u00f3lnie wa\u017cna jest kontrola wyj\u0105tk\u00f3w przy parsowaniu. Niepoprawny JSON bardzo \u0142atwo zatrzyma program.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-c-1\">Przyk\u0142ad w C<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c #include &lt;stdio.h&gt; int main() { printf(\"W C zwykle u\u017cywa si\u0119 bibliotek typu cJSON\\n\"); return 0; }<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W czystym C obs\u0142uga jest mniej wygodna, bo standard j\u0119zyka nie zawiera parsera JSON.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-w-php\">Przyk\u0142ad w PHP<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>PHP<\/td><td><code>php &lt;?php $json = '{\"name\":\"Piotr\",\"age\":30}'; $data = json_decode($json, true); echo $data[\"name\"]; ?&gt;<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><code>true<\/code> w <code>json_decode()<\/code> powoduje konwersj\u0119 do tablicy asocjacyjnej zamiast obiektu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"walidacja-struktury-i-kontrola-poprawnosci-danych-zanim-trafia-do-logiki-biznesowej\">Walidacja struktury i kontrola poprawno\u015bci danych zanim trafi\u0105 do logiki biznesowej<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To miejsce jest cz\u0119sto pomijane, a w\u0142a\u015bnie tutaj oszcz\u0119dza si\u0119 godziny debugowania.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u0142\u00f3\u017cmy, \u017ce system ksi\u0119gowy oczekuje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>invoice_id<\/code><\/li>\n\n\n\n<li><code>amount<\/code><\/li>\n\n\n\n<li><code>currency<\/code><\/li>\n\n\n\n<li><code>issued_at<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi <code>currency<\/code> b\u0119dzie puste, problem mo\u017ce ujawni\u0107 si\u0119 dopiero przy generowaniu raportu finansowego tydzie\u0144 p\u00f3\u017aniej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego warto stosowa\u0107 walidacj\u0119 ju\u017c na wej\u015bciu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prosty schemat kontroli:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Etap<\/th><th>Co sprawdzamy<\/th><\/tr><\/thead><tbody><tr><td>obecno\u015b\u0107 pola<\/td><td>czy klucz istnieje<\/td><\/tr><tr><td>typ danych<\/td><td>string, int, bool<\/td><\/tr><tr><td>zakres warto\u015bci<\/td><td>np. cena &gt; 0<\/td><\/tr><tr><td>format<\/td><td>email, data, numer telefonu<\/td><\/tr><tr><td>relacje<\/td><td>np. data ko\u0144ca &gt; data pocz\u0105tku<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad logiczny:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Regu\u0142a<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>cena dodatnia<\/td><td><code>price &gt; 0<\/code><\/td><\/tr><tr><td>poprawna liczba sztuk<\/td><td><code>quantity &gt;= 1<\/code><\/td><\/tr><tr><td>poprawna zni\u017cka<\/td><td><code>0 &lt;= discount &lt;= 100<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To nie s\u0105 detale. To ochrona przed realn\u0105 strat\u0105 pieni\u0119dzy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"praca-z-duzymi-odpowiedziami-i-paginacja-bez-przeciazania-pamieci-oraz-aplikacji\">Praca z du\u017cymi odpowiedziami i paginacj\u0105 bez przeci\u0105\u017cania pami\u0119ci oraz aplikacji<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nie ka\u017cde API zwraca 20 rekord\u00f3w. Czasem odpowied\u017a zawiera 50 000 pozycji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi aplikacja pr\u00f3buje wczyta\u0107 wszystko naraz:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ro\u015bnie zu\u017cycie RAM<\/li>\n\n\n\n<li>wyd\u0142u\u017ca si\u0119 czas odpowiedzi<\/li>\n\n\n\n<li>pojawiaj\u0105 si\u0119 timeouty<\/li>\n\n\n\n<li>ro\u015bnie ryzyko awarii procesu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego stosuje si\u0119 paginacj\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parametr<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td><code>page=1<\/code><\/td><td>numer strony<\/td><\/tr><tr><td><code>limit=100<\/code><\/td><td>liczba rekord\u00f3w<\/td><\/tr><tr><td><code>offset=200<\/code><\/td><td>przesuni\u0119cie<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Lepsza jest iteracyjna synchronizacja ni\u017c jednorazowe pobranie ca\u0142ej bazy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dodatkowo warto zapisywa\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>timestamp ostatniej synchronizacji<\/li>\n\n\n\n<li>identyfikator ostatnio przetworzonego rekordu<\/li>\n\n\n\n<li>log b\u0142\u0119d\u00f3w integracyjnych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego odzyskiwanie po awarii jest bardzo kosztowne.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-problemy-bledy-i-pulapki-podczas-pracy-z-systemami-wykorzystujacymi-dane-z-api-w-formacie-json\">Najcz\u0119stsze problemy, b\u0142\u0119dy i pu\u0142apki podczas pracy z systemami wykorzystuj\u0105cymi Dane z API w formacie JSON<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy problem nie jest techniczny, tylko organizacyjny: za\u0142o\u017cenie, \u017ce dokumentacja API zawsze jest aktualna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo cz\u0119sto nie jest.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pole opisane jako obowi\u0105zkowe znika. Typ zmienia si\u0119 z <code>int<\/code> na <code>string<\/code>. Endpoint dzia\u0142a inaczej ni\u017c opis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlatego warto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>logowa\u0107 surowe odpowiedzi<\/li>\n\n\n\n<li>wersjonowa\u0107 integracje<\/li>\n\n\n\n<li>testowa\u0107 na \u015brodowisku staging<\/li>\n\n\n\n<li>przygotowa\u0107 fallback<\/li>\n\n\n\n<li>nie zak\u0142ada\u0107 stabilno\u015bci bez monitoringu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi cz\u0119sty problem to brak obs\u0142ugi <code>null<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{<br>  \"phone\": null<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi system zak\u0142ada zawsze tekst, pojawia si\u0119 wyj\u0105tek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeci problem to kodowanie znak\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">UTF-8 powinno by\u0107 standardem, ale w starszych systemach nadal trafiaj\u0105 si\u0119 b\u0142\u0119dy polskich znak\u00f3w, zw\u0142aszcza przy integracjach z ERP i starszymi bazami danych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czwarty problem to limity API:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Ograniczenie<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td>rate limit<\/td><td>100 \u017c\u0105da\u0144\/min<\/td><\/tr><tr><td>quota dzienna<\/td><td>10 000 request\u00f3w<\/td><\/tr><tr><td>limit payload<\/td><td>maks. 5 MB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Brak kontroli limit\u00f3w ko\u0144czy si\u0119 blokad\u0105 dost\u0119pu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pi\u0105ty problem to brak retry.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sie\u0107 nie jest idealna. Timeout nie zawsze oznacza trwa\u0142y b\u0142\u0105d. Dobrze zaprojektowany system potrafi ponowi\u0107 \u017c\u0105danie z op\u00f3\u017anieniem i kontrol\u0105 liczby pr\u00f3b.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-json-jest-szybszy-od-xml\">Czy JSON jest szybszy od XML<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119\u015bciej tak. JSON jest l\u017cejszy, ma mniej znacznik\u00f3w i zwykle szybciej si\u0119 parsuje. R\u00f3\u017cnica jest szczeg\u00f3lnie widoczna przy du\u017cej liczbie ma\u0142ych \u017c\u0105da\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-ufac-dokumentacji-api\">Czy mo\u017cna ufa\u0107 dokumentacji API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie w pe\u0142ni. Dokumentacja jest punktem startowym, ale produkcja pokazuje rzeczywiste zachowanie systemu. Logowanie odpowiedzi jest obowi\u0105zkowe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-null-powoduje-tyle-problemow\">Dlaczego <code>null<\/code> powoduje tyle problem\u00f3w<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo wiele fragment\u00f3w kodu zak\u0142ada istnienie warto\u015bci. Gdy pojawia si\u0119 <code>null<\/code>, operacje na stringach, liczbach lub datach ko\u0144cz\u0105 si\u0119 b\u0142\u0119dem wykonania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-warto-zapisywac-pelne-odpowiedzi-z-api\">Czy warto zapisywa\u0107 pe\u0142ne odpowiedzi z API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, przynajmniej w logach technicznych lub \u015brodowisku testowym. Bez tego analiza b\u0142\u0119d\u00f3w integracyjnych bywa praktycznie niemo\u017cliwa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-parser-json-zawsze-wykryje-problem\">Czy parser JSON zawsze wykryje problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Parser sprawdza sk\u0142adni\u0119, ale nie logik\u0119 biznesow\u0105. JSON mo\u017ce by\u0107 poprawny technicznie i jednocze\u015bnie bezu\u017cyteczny biznesowo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-paginacja-jest-konieczna\">Czy paginacja jest konieczna<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przy ma\u0142ych odpowiedziach nie zawsze, ale przy wi\u0119kszych systemach jest praktycznie obowi\u0105zkowa. Brak paginacji szybko prowadzi do problem\u00f3w wydajno\u015bciowych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobra integracja nie polega na samym pobraniu odpowiedzi z serwera. Najwa\u017cniejsze jest przewidywanie b\u0142\u0119d\u00f3w, kontrola jako\u015bci danych i odporno\u015b\u0107 systemu na sytuacje, kt\u00f3re wcze\u015bniej czy p\u00f3\u017aniej i tak si\u0119 wydarz\u0105. API dzia\u0142a dobrze wtedy, gdy przestaje by\u0107 zauwa\u017calne dla u\u017cytkownika ko\u0144cowego \u2014 po prostu dostarcza poprawne dane we w\u0142a\u015bciwym momencie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nowoczesne aplikacje bardzo rzadko dzia\u0142aj\u0105 w pe\u0142ni samodzielnie. System sprzeda\u017cowy pobiera kursy walut z zewn\u0119trznego serwisu, aplikacja mobilna odczytuje prognoz\u0119 pogody, panel administracyjny wy\u015bwietla dane u\u017cytkownik\u00f3w z osobnego backendu, a sklep internetowy synchronizuje stany magazynowe z hurtowni\u0105. W praktyce programista niemal codziennie pracuje z odpowiedziami zwracanymi przez interfejsy sieciowe. Najwi\u0119cej problem\u00f3w pojawia si\u0119 wtedy, gdy trzeba poprawnie odczyta\u0107 Dane z API w formacie JSON. Dlaczego Dane z API w formacie JSON wymagaj\u0105 zrozumienia struktury i typ\u00f3w danych JSON (JavaScript Object Notation) jest lekkim formatem zapisu danych tekstowych. Powsta\u0142 jako prosty spos\u00f3b wymiany informacji mi\u0119dzy systemami, ale dzi\u015b jest standardem praktycznie wsz\u0119dzie: REST API, webhooki, komunikacja frontend\u2013backend, integracje z p\u0142atno\u015bciami, systemy ERP, aplikacje mobilne. Jego popularno\u015b\u0107 wynika z kilku powod\u00f3w: Najwa\u017cniejsze typy danych w JSON to: Prosty przyk\u0142ad odpowiedzi z serwera: Element Przyk\u0142ad JSON json { &#8222;id&#8221;: 15, &#8222;name&#8221;: &#8222;Jan Kowalski&#8221;, &#8222;active&#8221;: true, &#8222;roles&#8221;: [&#8222;admin&#8221;, &#8222;editor&#8221;], &#8222;address&#8221;: { &#8222;city&#8221;: &#8222;Warszawa&#8221;, &#8222;zip&#8221;: &#8222;00-001&#8221; } } Tutaj wyst\u0119puj\u0105 jednocze\u015bnie liczby, teksty, tablica oraz zagnie\u017cd\u017cony obiekt. To typowa sytuacja produkcyjna \u2014 realne odpowiedzi prawie nigdy nie s\u0105 p\u0142askie. Kluczowe jest zrozumienie r\u00f3\u017cnicy mi\u0119dzy obiektem a tablic\u0105. Obiekt przechowuje pary klucz\u2013warto\u015b\u0107: { &#8222;name&#8221;: &#8222;Anna&#8221;} Tablica przechchowuje list\u0119 element\u00f3w: [ &#8222;Anna&#8221;, &#8222;Piotr&#8221;, &#8222;Marek&#8221;] B\u0142\u0105d rozpoznania struktury powoduje p\u00f3\u017aniej klasyczne problemy: odwo\u0142anie do indeksu zamiast klucza albo odwrotnie. To jeden z najcz\u0119stszych powod\u00f3w awarii integracji. Warto te\u017c pami\u0119ta\u0107, \u017ce JSON nie posiada typu daty. Data zwykle przychodzi jako tekst: &#8222;created_at&#8221;: &#8222;2026-04-20T14:30:00Z&#8221; To oznacza konieczno\u015b\u0107 r\u0119cznego parsowania po stronie aplikacji. Jak dzia\u0142a przep\u0142yw danych od \u017c\u0105dania HTTP do obiektu dost\u0119pnego w kodzie programu Sam JSON nie pojawia si\u0119 znik\u0105d. Najpierw aplikacja wysy\u0142a \u017c\u0105danie HTTP: Serwer odpowiada kodem statusu: Kod Znaczenie 200 operacja poprawna 201 utworzono zas\u00f3b 400 b\u0142\u0105d po stronie klienta 401 brak autoryzacji 404 nie znaleziono zasobu 500 b\u0142\u0105d serwera Dopiero po poprawnym statusie zwykle analizujemy tre\u015b\u0107 odpowiedzi. Przyk\u0142ad odpowiedzi HTTP: Element Przyk\u0142ad Response Body json { &#8222;status&#8221;: &#8222;ok&#8221;, &#8222;data&#8221;: { &#8222;user_id&#8221;: 52, &#8222;email&#8221;: &#8222;user@example.com&#8221; } } Najpierw nale\u017cy sprawdzi\u0107 status odpowiedzi, potem nag\u0142\u00f3wek Content-Type, a dopiero p\u00f3\u017aniej parsowa\u0107 tre\u015b\u0107. W praktyce wiele b\u0142\u0119d\u00f3w wynika z za\u0142o\u017cenia, \u017ce odpowied\u017a zawsze ma poprawny format. Nie ma. API potrafi zwr\u00f3ci\u0107 HTML b\u0142\u0119du zamiast JSON, pust\u0105 odpowied\u017a albo komunikat serwisowy. Dlatego bezpieczna kolejno\u015b\u0107 wygl\u0105da tak: Jak poprawnie przetwarza\u0107 Dane z API w formacie JSON w aplikacjach backendowych i skryptach Najwa\u017cniejsza zasada: nie ufa\u0107 danym wej\u015bciowym. Je\u017celi dokumentacja m\u00f3wi, \u017ce pole price zawsze jest liczb\u0105, to i tak trzeba za\u0142o\u017cy\u0107, \u017ce kiedy\u015b b\u0119dzie pustym stringiem albo null. Produkcja szybko uczy pokory. Przyk\u0142ad w Python J\u0119zyk Kod Python python import requests response = requests.get(&#8222;https:\/\/api.example.com\/users\/15&#8221;) if response.status_code == 200: data = response.json() name = data.get(&#8222;name&#8221;, &#8222;brak&#8221;) print(name) else: print(&#8222;B\u0142\u0105d:&#8221;, response.status_code) get() jest bezpieczniejsze ni\u017c bezpo\u015brednie data[&#8222;name&#8221;], bo nie ko\u0144czy programu wyj\u0105tkiem przy braku klucza. Przyk\u0142ad w C++ J\u0119zyk Kod C++ cpp #include &lt;iostream&gt; #include &lt;nlohmann\/json.hpp&gt; using json = nlohmann::json; int main() { std::string text = R&#8221;({&#8222;name&#8221;:&#8221;Anna&#8221;,&#8221;age&#8221;:25})&#8221;; json data = json::parse(text); std::cout &lt;&lt; data[&#8222;name&#8221;] &lt;&lt; std::endl; return 0; } W C++ szczeg\u00f3lnie wa\u017cna jest kontrola wyj\u0105tk\u00f3w przy parsowaniu. Niepoprawny JSON bardzo \u0142atwo zatrzyma program. Przyk\u0142ad w C J\u0119zyk Kod C c #include &lt;stdio.h&gt; int main() { printf(&#8222;W C zwykle u\u017cywa si\u0119 bibliotek typu cJSON\\n&#8221;); return 0; } W czystym C obs\u0142uga jest mniej wygodna, bo standard j\u0119zyka nie zawiera parsera JSON. Przyk\u0142ad w PHP J\u0119zyk Kod PHP php &lt;?php $json = '{&#8222;name&#8221;:&#8221;Piotr&#8221;,&#8221;age&#8221;:30}&#8217;; $data = json_decode($json, true); echo $data[&#8222;name&#8221;]; ?&gt; true w json_decode() powoduje konwersj\u0119 do tablicy asocjacyjnej zamiast obiektu. Walidacja struktury i kontrola poprawno\u015bci danych zanim trafi\u0105 do logiki biznesowej To miejsce jest cz\u0119sto pomijane, a w\u0142a\u015bnie tutaj oszcz\u0119dza si\u0119 godziny debugowania. Za\u0142\u00f3\u017cmy, \u017ce system ksi\u0119gowy oczekuje: Je\u017celi currency b\u0119dzie puste, problem mo\u017ce ujawni\u0107 si\u0119 dopiero przy generowaniu raportu finansowego tydzie\u0144 p\u00f3\u017aniej. Dlatego warto stosowa\u0107 walidacj\u0119 ju\u017c na wej\u015bciu. Prosty schemat kontroli: Etap Co sprawdzamy obecno\u015b\u0107 pola czy klucz istnieje typ danych string, int, bool zakres warto\u015bci np. cena &gt; 0 format email, data, numer telefonu relacje np. data ko\u0144ca &gt; data pocz\u0105tku Przyk\u0142ad logiczny: Regu\u0142a Wz\u00f3r cena dodatnia price &gt; 0 poprawna liczba sztuk quantity &gt;= 1 poprawna zni\u017cka 0 &lt;= discount &lt;= 100 To nie s\u0105 detale. To ochrona przed realn\u0105 strat\u0105 pieni\u0119dzy. Praca z du\u017cymi odpowiedziami i paginacj\u0105 bez przeci\u0105\u017cania pami\u0119ci oraz aplikacji Nie ka\u017cde API zwraca 20 rekord\u00f3w. Czasem odpowied\u017a zawiera 50 000 pozycji. Je\u017celi aplikacja pr\u00f3buje wczyta\u0107 wszystko naraz: Dlatego stosuje si\u0119 paginacj\u0119. Przyk\u0142ad: Parametr Znaczenie page=1 numer strony limit=100 liczba rekord\u00f3w offset=200 przesuni\u0119cie Lepsza jest iteracyjna synchronizacja ni\u017c jednorazowe pobranie ca\u0142ej bazy. Dodatkowo warto zapisywa\u0107: Bez tego odzyskiwanie po awarii jest bardzo kosztowne. Najcz\u0119stsze problemy, b\u0142\u0119dy i pu\u0142apki podczas pracy z systemami wykorzystuj\u0105cymi Dane z API w formacie JSON Najcz\u0119stszy problem nie jest techniczny, tylko organizacyjny: za\u0142o\u017cenie, \u017ce dokumentacja API zawsze jest aktualna. Bardzo cz\u0119sto nie jest. Pole opisane jako obowi\u0105zkowe znika. Typ zmienia si\u0119 z int na string. Endpoint dzia\u0142a inaczej ni\u017c opis. Dlatego warto: Drugi cz\u0119sty problem to brak obs\u0142ugi null. Przyk\u0142ad: { &#8222;phone&#8221;: null} Je\u017celi system zak\u0142ada zawsze tekst, pojawia si\u0119 wyj\u0105tek. Trzeci problem to kodowanie znak\u00f3w. UTF-8 powinno by\u0107 standardem, ale w starszych systemach nadal trafiaj\u0105 si\u0119 b\u0142\u0119dy polskich znak\u00f3w, zw\u0142aszcza przy integracjach z ERP i starszymi bazami danych. Czwarty problem to limity API: Ograniczenie Przyk\u0142ad rate limit 100 \u017c\u0105da\u0144\/min quota dzienna 10 000 request\u00f3w limit payload maks. 5 MB Brak kontroli limit\u00f3w ko\u0144czy si\u0119 blokad\u0105 dost\u0119pu. Pi\u0105ty problem to brak retry. Sie\u0107 nie jest idealna. Timeout nie zawsze oznacza trwa\u0142y b\u0142\u0105d. Dobrze zaprojektowany system potrafi ponowi\u0107 \u017c\u0105danie z op\u00f3\u017anieniem i kontrol\u0105 liczby pr\u00f3b. FAQ Czy JSON jest szybszy od XML Najcz\u0119\u015bciej tak. JSON jest l\u017cejszy, ma mniej znacznik\u00f3w i zwykle szybciej si\u0119 parsuje. R\u00f3\u017cnica jest szczeg\u00f3lnie widoczna przy du\u017cej liczbie ma\u0142ych \u017c\u0105da\u0144. Czy mo\u017cna ufa\u0107 dokumentacji API Nie w pe\u0142ni. Dokumentacja jest punktem startowym, ale produkcja pokazuje rzeczywiste zachowanie systemu. Logowanie odpowiedzi jest obowi\u0105zkowe. Dlaczego null powoduje tyle problem\u00f3w Bo wiele fragment\u00f3w kodu zak\u0142ada istnienie warto\u015bci. Gdy pojawia si\u0119 null, operacje na stringach, liczbach lub datach ko\u0144cz\u0105 si\u0119 b\u0142\u0119dem wykonania. Czy warto zapisywa\u0107 pe\u0142ne odpowiedzi z API Tak, przynajmniej w logach technicznych lub \u015brodowisku testowym. Bez tego analiza b\u0142\u0119d\u00f3w integracyjnych bywa praktycznie niemo\u017cliwa. Czy parser JSON zawsze wykryje problem Nie. Parser sprawdza sk\u0142adni\u0119, ale nie logik\u0119 biznesow\u0105. JSON mo\u017ce by\u0107 poprawny technicznie i jednocze\u015bnie bezu\u017cyteczny biznesowo. Czy paginacja jest konieczna Przy ma\u0142ych odpowiedziach nie zawsze, ale przy wi\u0119kszych systemach jest praktycznie obowi\u0105zkowa. Brak paginacji szybko prowadzi do problem\u00f3w wydajno\u015bciowych. Dobra integracja nie polega na samym pobraniu odpowiedzi z serwera. Najwa\u017cniejsze jest przewidywanie b\u0142\u0119d\u00f3w, kontrola jako\u015bci danych i odporno\u015b\u0107 systemu na sytuacje, kt\u00f3re wcze\u015bniej czy p\u00f3\u017aniej i tak si\u0119 wydarz\u0105. API dzia\u0142a dobrze wtedy, gdy przestaje by\u0107 zauwa\u017calne dla u\u017cytkownika ko\u0144cowego \u2014 po prostu dostarcza poprawne dane we w\u0142a\u015bciwym momencie. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1356,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,1],"tags":[],"class_list":["post-1354","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie","category-poradnik"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1354"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1354\/revisions"}],"predecessor-version":[{"id":1357,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1354\/revisions\/1357"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1356"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}