Sign in Join
Wiki copytemporary

Streaming JSON/pl: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11[[JSON/pl|JSON]] (JavaScript Object Notation) to tekstowy, znormalizowany format danych. Jak sama nazwa wskazuje, dokumenty JSON są poprawnym kodem JavaScript i mogą być bezpośrednio konwertowane na obiekty JavaScript. JSON może jednak służyć do wymiany danych niezależnie od używanego języka programowania.
22
33W tym samouczku wyjaśniono, jak ładować dane JSON do programu Free Pascal i jak je w nim przetwarzać. Wyjaśnia także, jak konwertować dane z programu do JSON (np. Aby wysłać je do przeglądarki internetowej).
44
55## Ogólne wymagania
66
77Ładowanie i przechowywanie (przesyłanie strumieniowe) obiektów odbywa się za pomocą modułu fpjsonrtti. Ale ma to sens, gdy użyty jest również moduł Classes (szczegóły poniżej).
88
99Instrukcja użycia powinna zatem zawierać przynajmniej te dwa moduły:
1010
1111``` pascal
1212uses Classes, fpjsonrtti;
1313```
1414
1515Obecnie (maj 2014) istnieją pewne różnice między systemem przesyłania strumieniowego Free Pascala a JSON:
1616
1717- JSON to format danych, w którym rozróżniana jest wielkość liter. Wynika z tego, że właściwości obiektów Free Pascal muszą być zapisane w tym samym miejscu, co właściwości JSON.
1818- Za pomocą DefineProperties nie można zdefiniować żadnych właściwości. Nie można zapisać odwołań do metod (procedur obsługi zdarzeń).2
1919- [[TCollection/pl|TCollection]] i [[TStrings]] mogą być stosowane jako zamienniki tablic.
2020
2121Programy demonstracyjne wraz z kodem źródłowym kompilatora Free Pascal znajdują się w katalogu `packages/fcl-json/examples`.
2222
2323Taka jak poniżej struktura JSON, jest używana w dalszych przykładach:
2424
2525``` JavaScript
2626{
2727 "id" : 123, // liczba całkowita (integer)
2828 "obj" : { "name": "Witaj Świecie!" }, // jakiś obiekt
2929 "coll" : [ { "name": "Obiekt 1" }, { "name": "Obiekt 2" } ], // dwa obiekty w TCollection
3030 "strings": [ "Witaj 1", "Witaj 2" ] // ciągi znaków
3131}
3232```
3333
3434Można ją zdefiniować w programie Free Pascal jako wartość stałą w następujący sposób:
3535
3636``` pascal
3737const JSON_TESTDATA =
3838'{'+LineEnding+
3939' "id": 123,'+LineEnding+
4040' "obj": { "name": "Witaj Świecie!" },'+LineEnding+
4141' "coll": [ { "name": "Obiekt 1" }, { "name": "Obiekt 2" } ],'+LineEnding+
4242' "strings": [ "Witaj 1", "Witaj 2" ]'+LineEnding+
4343'}';
4444```
4545
4646## Struktura danych
4747
4848Podstawową klasą danych jest [[TPersistent]] z modułu Classes, ponieważ dla niej i wszystkich podklas tworzona jest [[Runtime Type Information (RTTI)|informacja o typie środowiska wykonawczego (RTTI)]]. Są one niezbędne do przesyłania strumieniowego. Ponieważ fpjsonrtti nie integruje się z systemem przesyłania strumieniowego, można również użyć dowolnej innej klasy przetłumaczonej za pomocą przełącznika kompilatora **{\$M+}**.
4949
5050Wszystkie właściwości do odczytu muszą być zadeklarowane w klasie jako [[Property|property]] w sekcji [[Published|published]]. Z reguły można używać odczytu i zapisu w celu odniesienia bezpośrednio do pola danych (zmiennej). Jeśli chcesz, możesz oczywiście użyć metod get i set.
5151
5252Poniższa definicja klasy wynika ze struktury JSON:
5353
5454``` pascal
5555type
5656 TNameObject = class(TCollectionItem) // klasa dla właściwości 'obj' typu TCollection
5757 private
5858 fName: String;
5959 published
6060 property name: String read fName write fName;
6161 end;
6262
6363 TBaseObject = class(TPersistent) // klasa dla całej struktury JSON
6464 private
6565 fid: Integer;
6666 fObj: TNameObject;
6767 fColl: TCollection;
6868 fStrings: TStrings;
6969 public
7070 constructor Create;
7171 destructor Destroy; override;
7272 published // wszystkie właściwości muszą mieć prawa dostępu published
7373 property id: Integer read fid write fid;
7474 property obj: TNameObject read fObj write fObj;
7575 property coll: TCollection read fColl;
7676 property strings: TStrings read fStrings;
7777 end;
7878```
7979
8080Klasa `TNameObject` została odziedziczona z [[TCollectionItem]]. Oznacza to, że można ją używać zarówno dla właściwości obj, jak i dla coll. Jeśli nie jest to pożądane, należy zdefiniować tutaj dwie różne klasy.
8181
8282TCollection i TStrings muszą zostać utworzone w konstruktorze klasy TBaseObject i zwolnione w destruktorze.
8383
8484``` pascal
8585constructor TBaseObject.Create;
8686begin
8787 // Utwórz kolekcję i listę ciągów
8888 fColl := TCollection.Create(TNameObject);
8989 fStrings := TStringList.Create;
9090 fObj := TNameObject.Create(nil);
9191end;
9292
9393destructor TBaseObject.Destroy;
9494begin
9595 // Zwolnij kolekcję i listę ciągów
9696 fColl.Free;
9797 fStrings.Free;
9898 fObj.Free;
9999 inherited Destroy;
100100end;
101101```
102102
103103Jeśli nie chcesz mieć więcej funkcji w klasach danych, ich definicja jest teraz kompletna.
104104
105105## Załaduj JSON
106106
107107Za pomocą metody `Procedure JSONToObject(Const JSON : TJSONStringType; AObject : TObject);` w klasie [[TJSONDeStreamer]] można przypisać dane JSON bezpośrednio do istniejącego obiektu. Przed wywołaniem metody należy utworzyć TJSONDeStreamer i obiekt docelowy.
108108
109109Poniższa metoda ładuje dane ze struktury JSON `JSON_TESTDATA` w obiekcie o, a następnie wypisuje bieżące wartości właściwości do konsoli.
110110
111111``` pascal
112112procedure DeStreamTest;
113113var
114114 DeStreamer: TJSONDeStreamer;
115115 o: TBaseObject;
116116 no: TNameObject;
117117 s: String;
118118begin
119119 WriteLn('DeStream test');
120120 WriteLn('======================================');
121121
122122 // Utwórz obiekt DeStreamer i obiekt docelowy
123123 DeStreamer := TJSONDeStreamer.Create(nil);
124124 o := TBaseObject.Create;
125125 try
126126 // Załaduj dane JSON do obiektu o
127127 DeStreamer.JSONToObject(JSON_TESTDATA, o);
128128 // wypisz ID
129129 WriteLn(o.id);
130130 // wypisz nazwę obiektu
131131 WriteLn(o.obj.name);
132132 // wypisz nazwy wszystkich obiektów
133133 for TCollectionItem(no) in o.coll do
134134 Writeln(no.name);
135135 // wypisz wszystkie ciągi
136136 for s in o.strings do
137137 WriteLn(s);
138138
139139 // Czyszczenie
140140 finally
141141 o.Destroy;
142142 DeStreamer.Destroy;
143143 end;
144144end;
145145```
146146
147147## Zapisywanie JSON
148148
149149Klasa [[TJSONStreamer]] służy do konwersji obiektu na tekstowy JSON. Tutaj używana jest metoda `Function ObjectToJSONString(AObject : TObject) : TJSONStringType;`.
150150
151151W poniższej procedurze tworzony jest obiekt, wypełniany danymi testowymi, a następnie konwertowany na JSON. Tekst JSON jest wyprowadzany na konsolę. Kolejność, w jakiej właściwości są wyprowadzane, nie może zostać określona.
152152
153153``` pascal
154154procedure StreamTest;
155155var
156156 Streamer: TJSONStreamer;
157157 o: TBaseObject;
158158 JSONString: String;
159159begin
160160 WriteLn('Stream test');
161161 WriteLn('======================================');
162162
163163 Streamer := TJSONStreamer.Create(nil);
164164 o := TBaseObject.Create;
165165 try
166166 // Skonfiguruj dane
167167 o.id := 123;
168168 o.obj.name := 'Witaj Świecie!';
169169 TNameObject(o.coll.Add).name := 'Obiekt 1';
170170 TNameObject(o.coll.Add).name := 'Obiekt 2';
171171 o.strings.Add('Witaj 1');
172172 o.strings.Add('Witaj 2');
173173
174174 Streamer.Options := Streamer.Options + [jsoTStringsAsArray]; // Zapisz ciągi jako tablicę JSON
175175 // konwersja do JSON i na wyjście konsoli
176176 JSONString := Streamer.ObjectToJSONString(o);
177177 WriteLn(JSONString);
178178
179179 // Czyszczenie
180180 finally
181181 o.Destroy;
182182 Streamer.Destroy;
183183 end;
184184end;
185185```
186186
187187## Wnioski
188188
189189Dzięki przedstawionej tu wiedzy, proste i złożone struktury danych JSON można załadować do programów Free Pascal. Jeśli konieczne będzie jakiekolwiek wstępne lub końcowe przetwarzanie danych JSON, dane tekstowe można najpierw załadować z modułu [[jsonparser]] do struktury danych JSON przy użyciu klasy [[TJSONParser]], a następnie odpowiednio manipulować za pomocą modułu [[fpJSON]].
190190
191191Za pomocą właściwości Options klasy TJSONStreamer można kontrolować, w jaki sposób dane wyjściowe mapują własne struktury danych w JSON.
192192
193193## Zobacz także
194194
195195- [[JSON/pl|JSON]]
196196- [[fcl-json/pl|fcl-json]]
197197- [[Streaming components/pl|Komponenty strumieniowe]]
198198
199199## Uwagi i referencje
200200
201-1. <div id="ref1">
202-
203- <http://lists.freepascal.org/fpc-pascal/2013-January/036254.html>
204-
205- </div>
201+1. <http://lists.freepascal.org/fpc-pascal/2013-January/036254.html>
206202
2072032. \<div id="ref2\>http://lists.lazarus.freepascal.org/pipermail/lazarus/2011-January/058878.html
208- </div>
209204
210205---
211206*From the Free Pascal wiki, page "Streaming JSON/pl", as it stood on 2023-01-31 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history