Sign in Join
Wiki copytemporary

Streaming JSON/ru: what changed

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

OldNewLine
1-> **Note:** Эта статья является перевод статьи с английского [[Streaming JSON]] от 2014-10-02, которая была переведена с помощью Google Translate с немецкого (оригинал). Понятно, что результат перевода может быть ужасным, вполне может требоваться ручная корректировка. **Убедительная просьба не использовать автоматический перевод без окончательной обработки**
1+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Примечание:** Эта статья является перевод статьи с английского [[Streaming JSON]] от 2014-10-02, которая была переведена с помощью Google Translate с немецкого (оригинал). Понятно, что результат перевода может быть ужасным, вполне может требоваться ручная корректировка. **Убедительная просьба не использовать автоматический перевод без окончательной обработки**
22
3-[[JSON]](JavaScript Object Notation) является текстовым, стандартизированным форматом данных. Как следует из названия, JSON документы являются правильным кодом JavaScript, где они могут быть непосредственно преобразованы в объекты JavaScript. Но сам по себе JSON может быть использован независимо от используемого языка программирования для обмена данными.
3+[[JSON]](JavaScript Object Notation) является текстовым, стандартизированным форматом данных. Как следует из названия, JSON документы являются правильным кодом JavaScript, где они могут быть непосредственно преобразованы в объекты JavaScript. Но сам по себе JSON может быть использован независимо от используемого языка программирования для обмена данными.
44
5-В этом руководстве объясняется, как загрузить данные в формате JSON в программе Free Pascal для обработки. Оно также объясняет, как преобразовать данные FPC в формате JSON (например, чтобы отправить их на веб-сервер).
5+В этом руководстве объясняется, как загрузить данные в формате JSON в программе Free Pascal для обработки. Оно также объясняет, как преобразовать данные FPC в формате JSON (например, чтобы отправить их на веб-сервер).
66
77## Общие положения и условия
88
9-Загрузка и хранение (маршалинг) FPC данных объекта осуществляется с помощью юнита "fpjsonrtti". Кроме того, может пригодиться класс Class в этом юните (см ниже).
10-
11-В связи с этим оператор USES должен содержать, по крайней мере, эти два юнита:
9+Загрузка и хранение (маршалинг) FPC данных объекта осуществляется с помощью юнита "fpjsonrtti". Кроме того, может пригодиться класс Class в этом юните (см ниже).
1210
13-``` pascal
11+В связи с этим раздел USES должен содержать, по крайней мере, эти два юнита:
12+```
1413USES Classes, fpjsonrtti;
1514```
1615
17-В настоящее время (май 2014 г.) есть некоторые отличия от потоковой системы Free Pascal с ??_предположительно_ JavaScript ??:
18-
19-- Данные в формате JSON чувствительны к регистру. Таким образом, свойства объектов Free Pascal, как свойства JSON должны быть написаны с правильным регистром.
20-- Нет свойств, которые могут быть определены как DefineProperties. Нельзя сохранить ссылки на методы (обработчики событий).2
21-- [[TCollection]] и [[TStrings]] может быть использован в качестве замены массивов.
16+В настоящее время (май 2014 г.) есть некоторые отличия от потоковой системы Free Pascal с ??_предположительно_ JavaScript ??:
2217
23-Демо-версия программы предоставляется с исходным кодом Free Pascal Compiler (в папке /packages/fcl-json/examples).
18+ * Данные в формате JSON чувствительны к регистру. Таким образом, свойства объектов Free Pascal, как свойства JSON должны быть написаны с правильным регистром.
19+ * Нет свойств, которые могут быть определены как DefineProperties. Нельзя сохранить ссылки на методы (обработчики событий).2
20+ * [[TCollection]] и [[TStrings]] может быть использован в качестве замены массивов.
2421
25-В качестве примера, мы приведём пример со следующими данными JSON:
22+Демо-версия программы предоставляется с исходным кодом Free Pascal Compiler (в папке /packages/fcl-json/examples).
2623
27-``` JavaScript
24+В качестве примера, мы приведём пример со следующими данными JSON:
25+```
2826{
29- "id" : 123, // Integer
30- "obj" : { "name": "Привет, мир!" }, // Object
31- "coll" : [ { "name": "Объект 1" }, { "name": "Объект 2" } ], // два объекта TCollection
32- "strings": [ "привет 1", "привет 2" ] // список строк
33-}
27+ "id" : 123, // Integer
28+ "obj" : { "name": "Привет, мир!" }, // Object
29+ "coll" : [ { "name": "Объект 1" }, { "name": "Объект 2" } ], // два объекта TCollection
30+ "strings": [ "привет 1", "привет 2" ] // список строк
31+ }
3432```
3533
36-Это может быть выполнено в Free Pascal с использованием констант следующим образом:
37-
38-``` pascal
34+Это может быть выполнено в Free Pascal с использованием констант следующим образом:
35+```
3936const JSON_TESTDATA =
40-'{'+LineEnding+
41-' "id": 123,'+LineEnding+
42-' "obj": { "name": "Привет, Мир!" },'+LineEnding+
43-' "coll": [ { "name": "Объект 1" }, { "name": "Объект 2" } ],'+LineEnding+
44-' "strings": [ "привет 1", "привет 2" ]'+LineEnding+
45-'}';
37+ '{'+LineEnding+
38+ ' "id": 123,'+LineEnding+
39+ ' "obj": { "name": "Привет, Мир!" },'+LineEnding+
40+ ' "coll": [ { "name": "Объект 1" }, { "name": "Объект 2" } ],'+LineEnding+
41+ ' "strings": [ "привет 1", "привет 2" ]'+LineEnding+
42+ '}';
4643```
4744
4845## Структура данных
4946
50-В качестве базового класса для обслуживания данных существует класс [[TPersistent]] из юнита Classes, так как для них и всех подклассов должен быть создан [[Runtime Type Information (RTTI)|Laufzeit-Typinformationen]] (RTTI). Это совершенно необходимо для маршаллинга. Поскольку fpjsonrtti не интегрирован в систему маршаллинга, любого другого класса, должна быть указана опция компилятора **{\$M+}**, для использования.
51-
52-Все объекты должны быть доступны как [[Property|property]] для чтения в разделе класса [[Published|published]]. В общем случае (переменная) должна быть доступна для чтения и записи непосредственно в поле данных. Если вы хотите, конечно, могут быть использованы методы getter и setter.
47+В качестве базового класса для обслуживания данных существует класс [[TPersistent]] из юнита Classes, так как для них и всех подклассов должен быть создан [[Runtime Type Information \(RTTI\|Laufzeit-Typinformationen]]> "Runtime Type Information \(RTTI\)") (RTTI). Это совершенно необходимо для маршаллинга. Поскольку fpjsonrtti не интегрирован в систему маршаллинга, любого другого класса, должна быть указана опция компилятора **{$M+}** , для использования.
5348
54-Для структуры JSON результаты определении класса представлены ниже.
49+Все объекты должны быть доступны как [[Property|property]] для чтения в разделе класса [[Published|published]]. В общем случае (переменная) должна быть доступна для чтения и записи непосредственно в поле данных. Если вы хотите, конечно, могут быть использованы методы getter и setter.
5550
56-``` Pascal
51+Для структуры JSON результаты определении класса представлены ниже.
52+```
5753TYPE
58- TNameObject = CLASS(TCollectionItem) // класс для свойства 'obj' и TCollection
59- PRIVATE
60- fName: String;
61- PUBLISHED
62- property name: String read fName write fName;
63- END;
64-
65- TBaseObject = CLASS(TPersistent) // класс для структуры JSON
66- PRIVATE
67- fid: Integer;
68- fObj: TNameObject;
69- fColl: TCollection;
70- fStrings: TStrings;
71- PUBLIC
72- CONSTRUCTOR Create;
73- DESTRUCTOR Destroy; override;
74- PUBLISHED// все свойства должны быть published
75- PROPERTY id: Integer read fid write fid;
76- PROPERTY obj: TNameObject read fObj write fObj;
77- PROPERTY coll: TCollection read fColl;
78- PROPERTY strings: TStrings read fStrings;
79- END;
54+ TNameObject = CLASS(TCollectionItem) // класс для свойства 'obj' и TCollection
55+ PRIVATE
56+ fName: String;
57+ PUBLISHED
58+ property name: String read fName write fName;
59+ END;
60+
61+ TBaseObject = CLASS(TPersistent) // класс для структуры JSON
62+ PRIVATE
63+ fid: Integer;
64+ fObj: TNameObject;
65+ fColl: TCollection;
66+ fStrings: TStrings;
67+ PUBLIC
68+ CONSTRUCTOR Create;
69+ DESTRUCTOR Destroy; override;
70+ PUBLISHED// все свойства должны быть published
71+ PROPERTY id: Integer read fid write fid;
72+ PROPERTY obj: TNameObject read fObj write fObj;
73+ PROPERTY coll: TCollection read fColl;
74+ PROPERTY strings: TStrings read fStrings;
75+ END;
8076```
8177
82-Класс `TNameObject` является потомком [[TCollectionItem]]. Таким образом, они могут оба для свойства *obj* использовать коллекции. Если это не желательно, здесь должны быть определены два различных класса.
83-
84-В конструкторе класса TBaseObject класс TCollection и список строк должен быть создан конструктором и уничтожен в деструкторе.
78+Класс `TNameObject` является потомком [[TCollectionItem]]. Таким образом, они могут оба для свойства _obj_ использовать коллекции. Если это не желательно, здесь должны быть определены два различных класса.
8579
86-``` Pascal
80+В конструкторе класса TBaseObject класс TCollection и список строк должен быть создан конструктором и уничтожен в деструкторе.
81+```
8782CONSTRUCTOR TBaseObject.Create;
88-BEGIN
89- // конструктор коллекции и StringList
90- fColl := TCollection.Create(TNameObject);
91- fStrings := TStringList.Create;
92- fObj := TNameObject.Create(nil);
93-END;
94-
95-DESTRUCTOR TBaseObject.Destroy;
96-BEGIN
97- // деструктор коллекции и StringList
98- fColl.Free;
99- fStrings.Free;
100- fObj.Free;
101- INHERITED Destroy;
102-END;
83+ BEGIN
84+ // конструктор коллекции и StringList
85+ fColl := TCollection.Create(TNameObject);
86+ fStrings := TStringList.Create;
87+ fObj := TNameObject.Create(nil);
88+ END;
89+
90+ DESTRUCTOR TBaseObject.Destroy;
91+ BEGIN
92+ // деструктор коллекции и StringList
93+ fColl.Free;
94+ fStrings.Free;
95+ fObj.Free;
96+ INHERITED Destroy;
97+ END;
10398```
10499
105-Если вы не хотите больше функций для данных классов, их определение закончено.
100+Если вы не хотите больше функций для данных классов, их определение закончено.
106101
107102## Загрузка JSON
108103
109-С помощью метода `Procedure JSONToObject(Const JSON : TJSONStringType; AObject : TObject);` в классе [[TJSONDeStreamer]] вы можете присвоить данные в формате JSON непосредственно *существующему* объекту; перед тем, как вызвать этот метод, вы должны создать TJSONDeStreamer и целевой объект.
110-
111-Следующий метод загружает данные из структуры JSON `JSON_TESTDATA` в объект "о" и затем выводит текущие значения свойств в консоли.
104+С помощью метода `Procedure JSONToObject(Const JSON : TJSONStringType; AObject : TObject);` в классе [[TJSONDeStreamer]] вы можете присвоить данные в формате JSON непосредственно _существующему_ объекту; перед тем, как вызвать этот метод, вы должны создать TJSONDeStreamer и целевой объект.
112105
113-``` pascal
106+Следующий метод загружает данные из структуры JSON `JSON_TESTDATA` в объект "о" и затем выводит текущие значения свойств в консоли.
107+```
114108PROCEDURE DeStreamTest;
115-VAR
116- DeStreamer: TJSONDeStreamer;
117- o: TBaseObject;
118- no: TNameObject;
119- s: String;
120-BEGIN
121- WriteLn('тест DeStream');
122- WriteLn('======================================');
123-
124- // объект DeStreamer и целевой объект
125- DeStreamer := TJSONDeStreamer.Create(nil);
126- o := TBaseObject.Create;
127- TRY
128- // загрузка данных JSON в объект o
129- DeStreamer.JSONToObject(JSON_TESTDATA, o);
130- // ID
131- WriteLn(o.id);
132- // имя объекта
133- WriteLn(o.obj.name);
134- // напечатать имена всех объектов
135- for TCollectionItem(no) in o.coll do
136- Writeln(no.name);
137- // вывести все строки
138- for s in o.strings do
139- WriteLn(s);
140-
141- // очистка
142- FINALLY
143- o.Destroy;
144- DeStreamer.Destroy;
145- END;
146-END;
109+ VAR
110+ DeStreamer: TJSONDeStreamer;
111+ o: TBaseObject;
112+ no: TNameObject;
113+ s: String;
114+ BEGIN
115+ WriteLn('тест DeStream');
116+ WriteLn('======================================');
117+
118+ // объект DeStreamer и целевой объект
119+ DeStreamer := TJSONDeStreamer.Create(nil);
120+ o := TBaseObject.Create;
121+ TRY
122+ // загрузка данных JSON в объект o
123+ DeStreamer.JSONToObject(JSON_TESTDATA, o);
124+ // ID
125+ WriteLn(o.id);
126+ // имя объекта
127+ WriteLn(o.obj.name);
128+ // напечатать имена всех объектов
129+ for TCollectionItem(no) in o.coll do
130+ Writeln(no.name);
131+ // вывести все строки
132+ for s in o.strings do
133+ WriteLn(s);
134+
135+ // очистка
136+ FINALLY
137+ o.Destroy;
138+ DeStreamer.Destroy;
139+ END;
140+ END;
147141```
148142
149143## Сохранение JSON
150144
151-Для преобразования объекта в текст JSON, используется класс [[TJSONStreamer]]. Здесь используется метод `FUNCTION ObjectToJSONString(AObject : TObject) : TJSONStringType;`.
152-
153-В следующей процедуре, объект создается, заполняется данными теста, а затем преобразуются в формат JSON. Порядок, в котором сохраняются свойства не могут зависеть от программиста.
145+Для преобразования объекта в текст JSON, используется класс [[TJSONStreamer]]. Здесь используется метод `FUNCTION ObjectToJSONString(AObject : TObject) : TJSONStringType;`.
154146
155-И, наконец, текст JSON выводится на консоль.
147+В следующей процедуре, объект создается, заполняется данными теста, а затем преобразуются в формат JSON. Порядок, в котором сохраняются свойства не могут зависеть от программиста.
156148
157-``` Pascal
149+И, наконец, текст JSON выводится на консоль.
150+```
158151PROCEDURE StreamTest;
159-VAR
160- Streamer: TJSONStreamer;
161- o: TBaseObject;
162- JSONString: String;
163-BEGIN
164- WriteLn('Stream test');
165- WriteLn('======================================');
166-
167- Streamer := TJSONStreamer.Create(nil);
168- o := TBaseObject.Create;
169- TRY
170- // установка данных
171- o.id := 123;
172- o.obj.name := 'Привет, мир!';
173- TNameObject(o.coll.Add).name := 'Объект 1';
174- TNameObject(o.coll.Add).name := 'Объект 2';
175- o.strings.Add('Привет 1');
176- o.strings.Add('Привет 2');
177-
178- Streamer.Options := Streamer.Options + [jsoTStringsAsArray]; // сохранение строки в JSON
179- // конвертация вывод и JSON
180- JSONString := Streamer.ObjectToJSONString(o);
181- WriteLn(JSONString);
182-
183- // очистка
184- FINALLY
185- o.Destroy;
186- Streamer.Destroy;
187- END;
188-END;
152+ VAR
153+ Streamer: TJSONStreamer;
154+ o: TBaseObject;
155+ JSONString: String;
156+ BEGIN
157+ WriteLn('Stream test');
158+ WriteLn('======================================');
159+
160+ Streamer := TJSONStreamer.Create(nil);
161+ o := TBaseObject.Create;
162+ TRY
163+ // установка данных
164+ o.id := 123;
165+ o.obj.name := 'Привет, мир!';
166+ TNameObject(o.coll.Add).name := 'Объект 1';
167+ TNameObject(o.coll.Add).name := 'Объект 2';
168+ o.strings.Add('Привет 1');
169+ o.strings.Add('Привет 2');
170+
171+ Streamer.Options := Streamer.Options + [jsoTStringsAsArray]; // сохранение строки в JSON
172+ // конвертация вывод и JSON
173+ JSONString := Streamer.ObjectToJSONString(o);
174+ WriteLn(JSONString);
175+
176+ // очистка
177+ FINALLY
178+ o.Destroy;
179+ Streamer.Destroy;
180+ END;
181+ END;
189182```
190183
191184## Вывод
192185
193-С помощью представленного знания, простые и сложные структуры данных JSON могут быть загружены в ваши программы на Free Pascal. Если необходима какая-либо пред- или постобработка данных JSON, текстовые данные могут быть изначально загружены в структуру данных в формате JSON (классом [[TJSONParser]] из юнита [[jsonparser]]), а затем можно обрабатывать с помощью юнита [[fpJSON]].
186+С помощью представленного знания, простые и сложные структуры данных JSON могут быть загружены в ваши программы на Free Pascal. Если необходима какая-либо пред- или постобработка данных JSON, текстовые данные могут быть изначально загружены в структуру данных в формате JSON (классом [[TJSONParser]] из юнита [[jsonparser]]), а затем можно обрабатывать с помощью юнита [[fpJSON]].
194187
195-Опции свойства TJSONStreamer могут быть использованы для управления представлением ваших собственных структур данных в формате JSON.
188+Опции свойства TJSONStreamer могут быть использованы для управления представлением ваших собственных структур данных в формате JSON.
196189
197190## Смотрите также
198191
199-- [[JSON/ru|JSON]]
200-- [[fcl-json/ru|fcl-json]]
201-- [[Streaming components]]
192+ * [[JSON/ru|JSON]]
193+ * [[fcl-json/ru|fcl-json]]
194+ * [[Streaming components]]
202195
203196## Примечания & Ссылки
204197
205-1. <http://lists.freepascal.org/fpc-pascal/2013-January/036254.html>
198+ 1. <http://lists.freepascal.org/fpc-pascal/2013-January/036254.html>
206199
207-2. \<div id="ref2\>http://lists.lazarus.freepascal.org/pipermail/lazarus/2011-January/058878.html
200+ 2. <http://lists.lazarus.freepascal.org/pipermail/lazarus/2011-January/058878.html>
208201
202+ *[RTTI]: Runtime Type Information
203+
209204---
210-*From the Free Pascal wiki, page "Streaming JSON/ru", as it stood on 2022-08-06 after a change by Kai Burghardt, 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).*
205+*From the Free Pascal wiki, page "Streaming JSON/ru", as the Internet Archive kept it on 2025-08-27, last changed on 2024-07-27. 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