1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
---
title: JSON
slug: Glossary/JSON
translation_of: Glossary/JSON
original_slug: JSON
---
<p><strong>JSON</strong> (<strong>JavaScript Object Notation</strong>) jest formatem wymiany danych. Przypomina podzbiór składni <a href="/pl/docs/JavaScript">JavaScriptu</a>, choć nie jest nim w ścisłym sensie tego terminu. (Zobacz <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON" title="en/JavaScript/Reference/Global Objects/JSON">JSON</a> w <a href="https://developer.mozilla.org/en/JavaScript/Reference" title="en/JavaScript/Reference">Dokumentacji JavaScript</a> aby poznać szczegóły). Użyteczny w dowolnym rodzaju aplikacji opartej o JavaScript, m.in. na stronach internetowych i w rozszerzeniach przeglądarek. Przykładowo, dane użytkownika w formacie JSON mogą być przechowywane w <a href="/pl/docs/DOM/document.cookie">ciasteczku</a> (cookie), zaś preferencje rozszerzenia mogą być przechowywane w formacie JSON przez przeglądarkę.</p>
<p>JSON może przechowywać liczby (<code>number</code>), wartości logiczne (<code>boolean</code>), ciagi znaków (<code>string</code>), <code>null</code>, tablice (uporządkowane sekwencje wartości) oraz obiekty (zbiory odwzorowań ciąg znaków-wartość) złożone z powyższych wartości (lub z innych tablic i obiektów). Nie definiuje naturalnej reprezentacji dla bardziej złożonych typów danych, jak funkcje, wyrażenia regularne, daty itd. (Obiekty typu Date są domyślnie serializowane w postaci ciągu znaków zawierającego datę w formacie ISO, zatem choć nie zostają odtworzone w oryginalnym formacie, informacja nie jest bezpowrotnie tracona). Gdy niezbędne jest przechowanie tego rodzaju danych, można przekształcić wartości w momencie serializacji, lub przed ich deserializacją, umożliwiając w ten sposób przechowanie w JSON dodatkowych typów danych.</p>
<h2 id="JSON_in_Firefox_2" name="JSON_in_Firefox_2">Użycie JSON poprzez obiekt JSON w JavaScripcie</h2>
<p>Najprościej użyć JSON za pośrednictwem standardowego <a href="/en/JavaScript/Reference/Global_Objects/JSON" title="en/JavaScript/Reference/Global Objects/JSON">obiektu JSON</a> w JavaScripcie. Użyj <a href="/en/JavaScript/Reference/Global_Objects/JSON/stringify" title="en/JavaScript/Reference/Global Objects/JSON/stringify">JSON.stringify</a> do serializacji wartości w formacie JSON, natomiast do deserializacji - <a href="/en/JavaScript/Reference/Global_Objects/JSON/parse" title="en/JavaScript/Reference/Global Objects/JSON/parse">JSON.parse</a>.</p>
<p>Na przykład, do serializacji obiektu JavaScript używamy metody <code>JSON.stringify()</code>:</p>
<pre class="brush: js">var foo = {};
foo.bar = "new property";
foo.baz = 3;
var JSONfoo = JSON.stringify(foo);
</pre>
<p><code>JSONfoo</code> ma teraz postać <code>{"bar":"new property","baz":3}</code>. Aby przywrócić <code>JSONfoo</code> do postaci obiektu JavaScript wystarczy wykonać:</p>
<pre class="brush: js">var backToJS = JSON.parse(JSONfoo);
</pre>
<p>Więcej informacji znajdziesz w dokumentacji <a href="/en/JavaScript/Reference/Global_Objects/JSON" title="en/JavaScript/Reference/Global Objects/JSON">obiektu JSON</a>.</p>
<h2 id="Metoda_toJSON()">Metoda toJSON()</h2>
<p>Jeśli obiekt definiuje metodę toJSON(), wówczas JSON.stringify wywoła tę metodę aby określić reprezentację obiektu w formacie JSON. Na przykład:</p>
<pre class="brush: js">x = {};
x.foo = "foo";
x.toJSON = function() { return "bar"; };
var json1 = JSON.stringify(x);
</pre>
<p><code>json1</code> zawiera teraz '"bar"'.</p>
<h2 id="Ograniczenia">Ograniczenia</h2>
<p>Nie można serializować obiektu zawierającego funkcje. Specyfikacja JSON nie pozwala na takie działanie. Na przykład:</p>
<pre class="brush: js">foo.qwerty = function(){alert('foobar');};
foo.qwerty()
var JSONfoo = JSON.toString(foo);
</pre>
<p>zwróci błąd <code>TypeError on line XXX: No JSON representation for this object!</code></p>
<h2 id="Użycie_JSON_poprzez_nsIJSON">Użycie JSON poprzez nsIJSON</h2>
<p>Wersje Firefoksa wcześniejsze niż 3.5 nie zawierały wsparcia dla formatu JSON, zaś jedynym sposobem dotarcia do funkcjonalności JSON było wykorzystanie komponentu <code><a href="/en/XPCOM_Interface_Reference/nsIJSON" title="en/nsIJSON">nsIJSON</a></code>, dostępnego począwszy od Firefox 3. Kodowanie i dekodowanie wykonywane są przez metody <code>encode</code> i <code>decode</code> komponentu <code>nsIJSON</code>. Metody te zakresem możliwości ustępują metodom dostarczanym przez obiekt JSON, zapewniając wsparcie jedynie tablicom i obiektom, z pominięciem ciągów znaków, wartości logicznych, liczb, czy <code>null</code>. (Wymienione wartości są obsługiwane jedynie wewnątrz tablic i obiektów: sama liczba <code>5</code> nie zadziała, lecz obiekt <code>{ "value": 5 }</code> już tak).</p>
<p>Ze względu na ograniczenia nsIJSON, jego metody encode i decode zostały usunięte począwszy od wersji Firefox 7. Deweloperom zaleca się używanie obiektu JSON.</p>
<p>Poniższy kod serializuje obiekt JavaScript przy użyciu<code> nsIJSON</code>:</p>
<pre class="brush: js">var Ci = Components.interfaces;
var Cc = Components.classes;
var foo = {};
foo.bar = "new property";
foo.baz = 3;
var nativeJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
var JSONfoo = nativeJSON.encode(foo);
</pre>
<p>Zmienna <code>JSONfoo</code> przyjmuje teraz wartość <code>{"bar":"new property","baz":3}</code>. Aby stworzyć obiekt odpowiadający <code>JSONfoo</code>, wystarczy wykonać:</p>
<pre class="brush: js">var backToJS = nativeJSON.decode(JSONfoo);
</pre>
<h2 id="Using_JSON" name="Using_JSON">Inne sposoby użycia JSON</h2>
<p>Choć teoretycznie możliwe jest użycie JSON korzystając z <a href="/en/JavaScript/Reference/Global_Objects/eval" title="en/JavaScript/Reference/Global Objects/eval">eval</a> (lecz tylko do deserializacji do obiektu, nie do serializacji do postaci ciągu znaków), lub z <a class="link-https" href="https://github.com/douglascrockford/JSON-js" title="https://github.com/douglascrockford/JSON-js">json2.js</a>, nie jest to dobrym pomysłem. Parsowanie JSON przy użyciu eval nie jest bezpieczne, gdyż eval dopuszcza znacznie więcej rodzajów składni niż JSON (w tym nawet wykonywanie całkiem arbitralnego fragmentu kodu). Z kolei problemem json2.js jest dodawanie metod do wbudowanych obiektów, jak <code>Object.prototype</code>, co może skutkować błędami w kodzie, w którym nie przewidziano z góry takiej możliwości. Dlatego w niemal wszystkich przypadkach zaleca się pozostanie przy normalnych metodach użycia JSON. </p>
<h2 id="See_also" name="See_also">Zobacz także</h2>
<ul>
<li>{{ interface("nsIJSON") }}</li>
</ul>
<p>{{ languages( { "ja": "ja/JSON", "zh-cn": "zh-cn/JSON" } ) }}</p>
|