{"id":13151,"date":"2026-09-24T18:25:00","date_gmt":"2026-09-24T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13151"},"modified":"2026-10-09T23:25:53","modified_gmt":"2026-10-09T21:25:53","slug":"tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/","title":{"rendered":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu"},"content":{"rendered":"<p>Dokument JSON mo\u017ce wygl\u0105da\u0107 poprawnie, a mimo to zosta\u0107 odrzucony przez aplikacj\u0119. Mo\u017ce te\u017c zosta\u0107 przyj\u0119ty, cho\u0107 liczba zostanie odczytana inaczej, ni\u017c zak\u0142adano. \u0141atwiej znale\u017a\u0107 przyczyn\u0119, gdy oddzielnie sprawdzisz sk\u0142adni\u0119 i znaczenie danych.<\/p>\n\n<p>Przejdziemy przez ma\u0142e przyk\u0142ady typowych problem\u00f3w: cudzys\u0142owy, nadmiarowe przecinki, powt\u00f3rzone klucze i du\u017ce identyfikatory. Chodzi o to, \u017ceby nast\u0119pny komunikat b\u0142\u0119du pomaga\u0142, zamiast zmusza\u0107 do przypadkowego przeszukiwania ca\u0142ego dokumentu.<\/p>\n<aside class=\"lw-article-context\" data-lw-editorial=\"20261009\"><p><strong>Dlaczego ten temat jest tutaj<\/strong> Tworz\u0119 w\u0142asne projekty internetowe w Node.js, Pythonie i PHP. Czytelne formaty danych te\u017c maj\u0105 wi\u0119c miejsce na tej stronie.<\/p><p><strong>Jak wypr\u00f3bowa\u0107 i zinterpretowa\u0107 wynik<\/strong> Na pocz\u0105tek wystarcz\u0105 ma\u0142e przyk\u0142ady zam\u00f3wie\u0144 i liczb poni\u017cej. Poprawna sk\u0142adnia nie m\u00f3wi jeszcze, czy dane pasuj\u0105 do aplikacji, kt\u00f3ra je odbiera.<\/p><\/aside>\n\n\n<figure class=\"lw-diagram\">\n<img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/json-pruefen-pl.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\"\n     alt=\"Zawarto\u015b\u0107 z siedmioma ponumerowanymi zastrze\u017ceniami zaznaczonymi w tek\u015bcie, pod spodem dwie kolumny oddzielaj\u0105ce pi\u0119\u0107 zg\u0142aszaj\u0105cych wyj\u0105tek od dw\u00f3ch cichych\">\n<figcaption>Pi\u0119\u0107 z siedmiu zatrzymuje parser. Pozosta\u0142e dwa daj\u0105 dokument czytaj\u0105cy si\u0119 czysto i znacz\u0105cy co innego.<\/figcaption>\n<\/figure>\n\n<h2>Dlaczego obiekt JavaScript nie jest JSON-em<\/h2>\n<p>Wszystko poprawne w JSON-ie jest poprawnym JavaScriptem. Odwrotnie ju\u017c nie, a w tym odst\u0119pie mieszkaj\u0105 b\u0142\u0119dy.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{                                     \/\/ JavaScript, nie JSON\n<\/span><span class=\"cbb-line\">  'order_id': 9007199254740993,       \/\/ pojedyncze cudzyslowy\n<\/span><span class=\"cbb-line\">  total: 129.90,                      \/\/ klucz bez cudzyslowow\n<\/span><span class=\"cbb-line\">  items: &#91; { sku: \"SKU-42\", qty: 2, } &#93;,   \/\/ przecinek przed nawiasem\n<\/span><span class=\"cbb-line\">  rabatt: NaN,                        \/\/ nie jest wartoscia JSON\n<\/span><span class=\"cbb-line\">  \/* komentarz *\/\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n\n\n<p>JSON dopuszcza cudzys\u0142owy podw\u00f3jne i \u017cadnych innych, wymaga cudzys\u0142ow\u00f3w przy ka\u017cdym kluczu, zabrania przecinka przed nawiasem zamykaj\u0105cym, nie zna komentarzy i zna dok\u0142adnie siedem rodzaj\u00f3w warto\u015bci: obiekt, list\u0119, ci\u0105g znak\u00f3w, liczb\u0119, <code>true<\/code>, <code>false<\/code> oraz <code>null<\/code>. Nie ma <code>undefined<\/code>, nie ma <code>NaN<\/code>, nie ma <code>Infinity<\/code> i nie ma daty.<\/p>\n<p>Daty cz\u0119sto budz\u0105 zaskoczenie, bo JSON nie ma dla nich osobnej reprezentacji. Nadawca i odbiorca musz\u0105 uzgodni\u0107, jak odczytywa\u0107 ci\u0105g znak\u00f3w lub liczb\u0119 jako dat\u0119. Parser nie wykryje, \u017ce ka\u017cda ze stron rozumie ten format inaczej.<\/p>\n\n<h2>Pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek<\/h2>\n<p>To te g\u0142o\u015bne, a ka\u017cdy z nich daje ten sam ma\u0142o pomocny komunikat o nieoczekiwanym tokenie.<\/p>\n<table style=\"width:100%;border-collapse:collapse;table-layout:auto;\">\n<thead>\n<tr><th style=\"vertical-align:top;\">B\u0142\u0105d<\/th><th style=\"vertical-align:top;\">Jak wygl\u0105da<\/th><\/tr>\n<\/thead>\n<tbody>\n<tr><td style=\"white-space:nowrap;vertical-align:top;\">Pojedyncze cudzys\u0142owy<\/td><td>&#8216;order_id&#8217; zamiast &#8220;order_id&#8221;<\/td><\/tr>\n<tr><td style=\"white-space:nowrap;vertical-align:top;\">Klucz bez cudzys\u0142ow\u00f3w<\/td><td>total: 129.90 zamiast &#8220;total&#8221;: 129.90<\/td><\/tr>\n<tr><td style=\"white-space:nowrap;vertical-align:top;\">Przecinek przed nawiasem<\/td><td>Przecinek przed } albo ]<\/td><\/tr>\n<tr><td style=\"white-space:nowrap;vertical-align:top;\">Komentarz<\/td><td>Wszystko po \/\/ albo mi\u0119dzy \/* a *\/<\/td><\/tr>\n<tr><td style=\"white-space:nowrap;vertical-align:top;\">Surowy koniec linii w ci\u0105gu<\/td><td>Znak nowej linii w cudzys\u0142owach; potrzebne jest \\n<\/td><\/tr>\n<\/tbody>\n<\/table>\n<p>Sz\u00f3sty nale\u017cy do tej samej grupy i wcale nie jest widoczny: znacznik kolejno\u015bci bajt\u00f3w na pocz\u0105tku pliku. To trzy niewidoczne bajty przed nawiasem otwieraj\u0105cym, a parser zg\u0142asza nieoczekiwany token na pozycji 0 &#8211; co wygl\u0105da, jakby problemem by\u0142 nawias. Plik wygl\u0105daj\u0105cy bezb\u0142\u0119dnie i zawodz\u0105cy na pozycji 0 taki znacznik ma, a edytor z ustawieniem zapisu bez znacznika go usuwa.<\/p>\n\n<h2>Dwa, kt\u00f3re nic nie zg\u0142aszaj\u0105<\/h2>\n<p>Tych warto szuka\u0107 celowo, bo nic innego na nie nie wska\u017ce.<\/p>\n<p>Pierwszym jest zdublowany klucz. Specyfikacja go dopuszcza, a zachowaniem zwyczajowym jest, \u017ce wygrywa ostatni &#8211; dokument z dwoma <code>\"total\"<\/code> czyta si\u0119 wi\u0119c czysto i niesie warto\u015b\u0107 drug\u0105. Gdy oba le\u017c\u0105 w d\u0142ugiej zawarto\u015bci daleko od siebie, powstaje liczba ani niewygl\u0105daj\u0105ca b\u0142\u0119dnie, ani nieb\u0119d\u0105ca poprawn\u0105.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">{ \"total\": 129.90, \"currency\": \"EUR\", \"total\": 139.90 }\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">JSON.parse(...).total   \u2192   139.90<\/span><\/code><\/pre><\/figure>\n\n\n<p>Drugim jest du\u017ca liczba ca\u0142kowita. Liczby w JavaScripcie s\u0105 zmiennoprzecinkowe, a ca\u0142kowite pozostaj\u0105 dok\u0142adne tylko do 2^53 \u2212 1. Numer zam\u00f3wienia, identyfikator z bazy danych, identyfikator Meta CAPI &#8211; wszystkie regularnie to przekraczaj\u0105, a parser zaokr\u0105gla je bez s\u0142owa.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">JSON.parse('{\"id\": 9007199254740993}').id   \u2192   9007199254740992\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">JSON.parse('{\"id\": \"9007199254740993\"}').id \u2192   \"9007199254740993\"<\/span><\/code><\/pre><\/figure>\n\n\n<p>Wynikaj\u0105ca zasada jest kr\u00f3tka: identyfikator jest ci\u0105giem znak\u00f3w, zawsze, tak\u017ce gdy sk\u0142ada si\u0119 z samych cyfr. Nikt na nim i tak nie liczy, a ci\u0105g znak\u00f3w przechodzi przez ka\u017cdy parser bez zmian.<\/p>\n\n<h2>Odczyt zg\u0142aszanej pozycji<\/h2>\n<p>Pozycja w komunikacie b\u0142\u0119du to przesuni\u0119cie znakowe w ca\u0142ym dokumencie, a w zawarto\u015bci zminifikowanej jest to liczba bez znaczenia.<\/p>\n<p>Pierwszym krokiem jest wi\u0119c zawsze sformatowanie dokumentu, a nie szukanie b\u0142\u0119du. Sformatowana zawarto\u015b\u0107 uk\u0142ada pozycj\u0119 na linii, a linia powy\u017cej wskazanej jest zwykle w\u0142a\u015bciwym miejscem usterki &#8211; brakuj\u0105cy przecinek rzuca si\u0119 w oczy przy nast\u0119pnym tokenie, a nie tam, gdzie go brakuje.<\/p>\n\n\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"javascript\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">JavaScript<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-javascript\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">try<\/span> {\n<\/span><span class=\"cbb-line\">  JSON.<span class=\"cbb-function\">parse<\/span>(text);\n<\/span><span class=\"cbb-line\">} <span class=\"cbb-keyword\">catch<\/span> (e) {\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">const<\/span> stelle = <span class=\"cbb-function\">Number<\/span>((e.message.<span class=\"cbb-function\">match<\/span>(\/<span class=\"cbb-function\">position<\/span> (\\d+)\/) || &#91;&#93;)&#91;<span class=\"cbb-number\">1<\/span>&#93;);\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-keyword\">if<\/span> (!<span class=\"cbb-type\">Number<\/span>.<span class=\"cbb-function\">isNaN<\/span>(stelle)) {\n<\/span><span class=\"cbb-line\">    console.<span class=\"cbb-function\">log<\/span>(text.<span class=\"cbb-function\">slice<\/span>(<span class=\"cbb-type\">Math<\/span>.<span class=\"cbb-function\">max<\/span>(<span class=\"cbb-number\">0<\/span>, stelle - <span class=\"cbb-number\">60<\/span>), stelle + <span class=\"cbb-number\">60<\/span>));\n<\/span><span class=\"cbb-line\">    console.<span class=\"cbb-function\">log<\/span>(<span class=\"cbb-string\">\" \"<\/span>.<span class=\"cbb-function\">repeat<\/span>(<span class=\"cbb-type\">Math<\/span>.<span class=\"cbb-function\">min<\/span>(<span class=\"cbb-number\">60<\/span>, stelle)) + <span class=\"cbb-string\">\"^\"<\/span>);\n<\/span><span class=\"cbb-line\">  }\n<\/span><span class=\"cbb-line\">}<\/span><\/code><\/pre><\/figure>\n\n\n<p>Sze\u015b\u0107dziesi\u0105t znak\u00f3w po ka\u017cdej stronie wystarcza niemal zawsze, aby zobaczy\u0107 problem, a daszek zdejmuje konieczno\u015b\u0107 liczenia. Warto zachowa\u0107 to jako gotowy fragment, bo alternatyw\u0105 jest otwarcie formatera, wklejenie, przewijanie i utrata pozycji.<\/p>\n\n<h2>Sprawdzenie w wierszu polece\u0144<\/h2>\n<p>Gdy zawarto\u015b\u0107 pochodzi z pliku albo z \u017c\u0105dania, na pytanie odpowiada jedno polecenie.<\/p>\n\n\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"bash\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Shell<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-bash\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\"># poprawny? sformatowane wyjscie albo blad z numerem linii<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">jq<\/span> . nutzlast.json\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># sama odpowiedz, bez tresci<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">jq<\/span> <span class=\"cbb-attr\">-e<\/span> . nutzlast.json <span class=\"cbb-operator\">&gt;<\/span>\/dev\/null <span class=\"cbb-operator\">&amp;&amp;<\/span> <span class=\"cbb-function\">echo<\/span> <span class=\"cbb-string\">\"poprawny\"<\/span> <span class=\"cbb-operator\">||<\/span> <span class=\"cbb-function\">echo<\/span> <span class=\"cbb-string\">\"niepoprawny\"<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># znalezc zdublowane klucze - --stream zglasza kazda pare, takze powtorzona<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">jq<\/span> <span class=\"cbb-attr\">-c<\/span> <span class=\"cbb-attr\">--stream<\/span> <span class=\"cbb-string\">'select(length == 2) | .&#91;0&#93;'<\/span> nutzlast.json <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">sort<\/span> <span class=\"cbb-operator\">|<\/span> <span class=\"cbb-function\">uniq<\/span> <span class=\"cbb-attr\">-d<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-comment\"># duze liczby, ktore straca dokladnosc<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-function\">grep<\/span> <span class=\"cbb-attr\">-oE<\/span> <span class=\"cbb-string\">'\"&#91;a-z_&#93;+\": *&#91;0-9&#93;{16,}'<\/span> nutzlast.json<\/span><\/code><\/pre><\/figure>\n\n\n<p>Trzecie polecenie op\u0142aca si\u0119 na ka\u017cdej nigdy niesprawdzanej zawarto\u015bci. Wypisuje \u015bcie\u017cki wyst\u0119puj\u0105ce wi\u0119cej ni\u017c raz, a to maszynowa droga do przypadku cichego &#8211; przy zawarto\u015bci generowanej znajduje co\u015b zaskakuj\u0105co cz\u0119sto, bo szablon dopisuj\u0105cy pole w dw\u00f3ch ga\u0142\u0119ziach wytwarza dok\u0142adnie to.<\/p>\n\n<h2>Gdzie liczy si\u0119 to najbardziej<\/h2>\n<p>Trzy miejsca zamieniaj\u0105 drobny b\u0142\u0105d JSON w co\u015b trudnego do zauwa\u017cenia p\u00f3\u017aniej.<\/p>\n<p>Blok JSON-LD na stronie jest pierwszym. B\u0142\u0105d sk\u0142adni oznacza, \u017ce wyszukiwarki nie odczytuj\u0105 \u017cadnych danych strukturalnych, a strona nadal dzia\u0142a bez zarzutu &#8211; nic w witrynie nie wskazuje wi\u0119c na problem, a strata pojawia si\u0119 tygodnie p\u00f3\u017aniej jako brak wynik\u00f3w rozszerzonych. Kontrol\u0105, kt\u00f3ra to wy\u0142apuje, jest walidator na stronie wys\u0142anej, a nie na szablonie.<\/p>\n<p>Zawarto\u015b\u0107 Conversions API jest drugim. Platforma odbieraj\u0105ca odpowiada b\u0142\u0119dem, ale ten b\u0142\u0105d stoi w odpowiedzi serwer-serwer, kt\u00f3rej nikt nie obserwuje, a nieudane zdarzenie po prostu si\u0119 nie pojawia. To tutaj zdublowany klucz czyni najwi\u0119ksz\u0105 szkod\u0119: zawarto\u015b\u0107 z warto\u015bci\u0105 zdarzenia dwa razy wysy\u0142a t\u0119 b\u0142\u0119dn\u0105, a i nadawca, i odbiorca uwa\u017caj\u0105 \u017c\u0105danie za udane.<\/p>\n<p>Konfiguracja szablonu mened\u017cera tag\u00f3w jest trzecim. Jej JSON czytany jest raz przy wczytaniu szablonu, a b\u0142\u0119dne pole potrafi zostawi\u0107 szablon zainstalowany, lecz bezczynny. Ten przypadek r\u00f3\u017cni si\u0119 tym, \u017ce zawodzi przy imporcie, a nie w trakcie dzia\u0142ania &#8211; to lepsze miejsce na pora\u017ck\u0119, i tylko wtedy, gdy kto\u015b przeczyta komunikat.<\/p>\n<p>Wszystkim trzem wsp\u00f3lne jest jedno: sprawdza si\u0119 tam, gdzie zawarto\u015b\u0107 powstaje, a nie tam, gdzie zostaje zu\u017cyta. Krok budowania przepuszczaj\u0105cy parser przez ka\u017cdy wytworzony plik nic nie kosztuje i wy\u0142apuje wszystkie pi\u0119\u0107 g\u0142o\u015bnych b\u0142\u0119d\u00f3w, zanim opuszcz\u0105 maszyn\u0119.<\/p>\n\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n\n<h3>Czy przy zdublowanym kluczu w ka\u017cdym parserze wygrywa ostatnia warto\u015b\u0107?<\/h3>\n<p>Nie, i w\u0142a\u015bnie w tym tkwi wi\u0119ksze niebezpiecze\u0144stwo. Specyfikacja JSON, RFC 8259, m\u00f3wi jedynie, \u017ce nazwy w obiekcie powinny by\u0107 unikalne, i wyra\u017anie odnotowuje, \u017ce odbiorcy zachowuj\u0105 si\u0119 przy zdublowanych nazwach r\u00f3\u017cnie: wiele implementacji zachowuje ostatni\u0105 warto\u015b\u0107, inne zg\u0142aszaj\u0105 b\u0142\u0105d, a jeszcze inne przekazuj\u0105 dalej wszystkie pary. JSON.parse, modu\u0142 json w Pythonie i jq zachowuj\u0105 ostatni\u0105.<\/p>\n<p>K\u0142opot pojawia si\u0119, gdy tylko dwa miejsca czytaj\u0105 t\u0119 sam\u0105 zawarto\u015b\u0107 r\u00f3\u017cnymi parserami. Je\u015bli walidator sprawdza pierwsz\u0105 warto\u015b\u0107, a odbiorca przetwarza ostatni\u0105, sprawdzenie widzia\u0142o inn\u0105 warto\u015b\u0107 ni\u017c odbiorca, a obie strony zg\u0142aszaj\u0105 sukces.<\/p>\n<p>We w\u0142asnym kodzie da si\u0119 ten przypadek twardo odrzuci\u0107. W Pythonie wystarczy <code>object_pairs_hook<\/code>, kt\u00f3ry liczy klucze ka\u017cdego obiektu i przy zdublowaniu zg\u0142asza wyj\u0105tek; cichy przypadek staje si\u0119 wtedy r\u00f3wnie g\u0142o\u015bny jak pi\u0119\u0107 b\u0142\u0119d\u00f3w z tabeli.<\/p>\n\n<h3>Czy jq . pokazuje du\u017c\u0105 liczb\u0119 dok\u0142adnie tak, jak stoi w pliku?<\/h3>\n<p>To zale\u017cy od wersji. Do jq 1.6 ka\u017cda liczba jest wczytywana jako zmiennoprzecinkowa, a sformatowane wyj\u015bcie pokazuje 9007199254740993 jako 9007199254740992, tak samo jak JSON.parse, wi\u0119c zapisana kopia tego wyj\u015bcia traci cyfr\u0119; dopiero od jq 1.7 liczba z pliku pozostaje niezmieniona, dop\u00f3ki nie wykonuje si\u0119 na niej oblicze\u0144. Niezawodne jest wi\u0119c polecenie grep z artyku\u0142u, bo czyta tekst pliku, a nie sparsowan\u0105 warto\u015b\u0107.<\/p>\n<\/div>\n\n<div class=\"lw-quellen\">\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Reference\/Elements\/script\" target=\"_blank\" rel=\"noopener noreferrer\">MDN: the script element<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\" target=\"_blank\" rel=\"noopener noreferrer\">MDN: JavaScript<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Dokument JSON mo\u017ce wygl\u0105da\u0107 poprawnie, a mimo to zosta\u0107 odrzucony przez aplikacj\u0119. Mo\u017ce te\u017c zosta\u0107 przyj\u0119ty, cho\u0107 liczba zostanie odczytana inaczej, ni\u017c zak\u0142adano. \u0141atwiej znale\u017a\u0107 przyczyn\u0119, gdy oddzielnie sprawdzisz sk\u0142adni\u0119 i znaczenie danych.<\/p>\n","protected":false},"author":1,"featured_media":13257,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[154],"tags":[92229,92271,92238],"class_list":["post-13151","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-tworzenie-stron-internetowych","tag-devops-pl","tag-javascript-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-24T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T21:25:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu\",\"datePublished\":\"2026-09-24T16:25:00+00:00\",\"dateModified\":\"2026-10-09T21:25:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/\"},\"wordCount\":1264,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png\",\"keywords\":[\"DevOps\",\"JavaScript\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/\",\"name\":\"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png\",\"datePublished\":\"2026-09-24T16:25:00+00:00\",\"dateModified\":\"2026-10-09T21:25:53+00:00\",\"description\":\"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/tworzenie-stron-internetowych\\\/tutorials-pl-tworzenie-stron-internetowych\\\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik","description":"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik","og_description":"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-24T16:25:00+00:00","article_modified_time":"2026-10-09T21:25:53+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu","datePublished":"2026-09-24T16:25:00+00:00","dateModified":"2026-10-09T21:25:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/"},"wordCount":1264,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png","keywords":["DevOps","JavaScript","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/","name":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png","datePublished":"2026-09-24T16:25:00+00:00","dateModified":"2026-10-09T21:25:53+00:00","description":"Dlaczego obiekt JavaScript nie jest JSON-em, pi\u0119\u0107 b\u0142\u0119d\u00f3w zg\u0142aszaj\u0105cych wyj\u0105tek i dwa zmieniaj\u0105ce warto\u015b\u0107 bez ostrze\u017cenia.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/hero-13151-tutorial-sprawdzenie-json-a-zanim-trafi-.png","width":1200,"height":630,"caption":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/tworzenie-stron-internetowych\/tutorials-pl-tworzenie-stron-internetowych\/tutorial-sprawdzenie-json-a-zanim-trafi-do-tagu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Sprawdzenie JSON-a, zanim trafi do tagu"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13151"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13151\/revisions"}],"predecessor-version":[{"id":22341,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13151\/revisions\/22341"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13257"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}