Sign in Join
Wiki copytemporary

Streaming JSON/ru: what changed

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

Title: Streaming JSON/ru

OldNewLine
1+> **Note:** Эта статья является перевод статьи с английского [[Streaming JSON]] от 2014-10-02, которая была переведена с помощью Google Translate с немецкого (оригинал). Понятно, что результат перевода может быть ужасным, вполне может требоваться ручная корректировка. **Убедительная просьба не использовать автоматический перевод без окончательной обработки**
2+
3+[[JSON]](JavaScript Object Notation) является текстовым, стандартизированным форматом данных. Как следует из названия, JSON документы являются правильным кодом JavaScript, где они могут быть непосредственно преобразованы в объекты JavaScript. Но сам по себе JSON может быть использован независимо от используемого языка программирования для обмена данными.
4+
5+В этом руководстве объясняется, как загрузить данные в формате JSON в программе Free Pascal для обработки. Оно также объясняет, как преобразовать данные FPC в формате JSON (например, чтобы отправить их на веб-сервер).
6+
7+## Общие положения и условия
8+
9+Загрузка и хранение (маршалинг) FPC данных объекта осуществляется с помощью юнита "fpjsonrtti". Кроме того, может пригодиться класс Class в этом юните (см ниже).
10+
11+В связи с этим оператор USES должен содержать, по крайней мере, эти два юнита:
12+
13+``` pascal
14+USES Classes, fpjsonrtti;
15+```
16+
17+В настоящее время (май 2014 г.) есть некоторые отличия от потоковой системы Free Pascal с ??_предположительно_ JavaScript ??:
18+
19+- Данные в формате JSON чувствительны к регистру. Таким образом, свойства объектов Free Pascal, как свойства JSON должны быть написаны с правильным регистром.
20+- Нет свойств, которые могут быть определены как DefineProperties. Нельзя сохранить ссылки на методы (обработчики событий).2
21+- [[TCollection]] и [[TStrings]] может быть использован в качестве замены массивов.
22+
23+Демо-версия программы предоставляется с исходным кодом Free Pascal Compiler (в папке /packages/fcl-json/examples).
24+
25+В качестве примера, мы приведём пример со следующими данными JSON:
26+
27+``` JavaScript
28+{
29+ "id" : 123, // Integer
30+ "obj" : { "name": "Привет, мир!" }, // Object
31+ "coll" : [ { "name": "Объект 1" }, { "name": "Объект 2" } ], // два объекта TCollection
32+ "strings": [ "привет 1", "привет 2" ] // список строк
33+}
34+```
35+
36+Это может быть выполнено в Free Pascal с использованием констант следующим образом:
37+
38+``` pascal
39+const 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+'}';
46+```
47+
48+## Структура данных
49+
50+В качестве базового класса для обслуживания данных существует класс [[TPersistent]] из юнита Classes, так как для них и всех подклассов должен быть создан [[Runtime Type Information (RTTI)|Laufzeit-Typinformationen]] (<abbr title="Runtime Type Information">RTTI</abbr>). Это совершенно необходимо для маршаллинга. Поскольку fpjsonrtti не интегрирован в систему маршаллинга, любого другого класса, должна быть указана опция компилятора **{\$M+}**, для использования.
51+
52+Все объекты должны быть доступны как [[Property|property]] для чтения в разделе класса [[Published|published]]. В общем случае (переменная) должна быть доступна для чтения и записи непосредственно в поле данных. Если вы хотите, конечно, могут быть использованы методы getter и setter.
53+
54+Для структуры JSON результаты определении класса представлены ниже.
55+
56+``` Pascal
57+TYPE
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;
80+```
81+
82+Класс `TNameObject` является потомком [[TCollectionItem]]. Таким образом, они могут оба для свойства *obj* использовать коллекции. Если это не желательно, здесь должны быть определены два различных класса.
83+
84+В конструкторе класса TBaseObject класс TCollection и список строк должен быть создан конструктором и уничтожен в деструкторе.
85+
86+``` Pascal
87+CONSTRUCTOR 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;
103+```
104+
105+Если вы не хотите больше функций для данных классов, их определение закончено.
106+
107+## Загрузка JSON
108+
109+С помощью метода `Procedure JSONToObject(Const JSON : TJSONStringType; AObject : TObject);` в классе [[TJSONDeStreamer]] вы можете присвоить данные в формате JSON непосредственно *существующему* объекту; перед тем, как вызвать этот метод, вы должны создать TJSONDeStreamer и целевой объект.
110+
111+Следующий метод загружает данные из структуры JSON `JSON_TESTDATA` в объект "о" и затем выводит текущие значения свойств в консоли.
112+
113+``` pascal
114+PROCEDURE 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;
147+```
148+
149+## Сохранение JSON
150+
151+Для преобразования объекта в текст JSON, используется класс [[TJSONStreamer]]. Здесь используется метод `FUNCTION ObjectToJSONString(AObject : TObject) : TJSONStringType;`.
152+
153+В следующей процедуре, объект создается, заполняется данными теста, а затем преобразуются в формат JSON. Порядок, в котором сохраняются свойства не могут зависеть от программиста.
154+
155+И, наконец, текст JSON выводится на консоль.
156+
157+``` Pascal
158+PROCEDURE 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;
189+```
190+
191+## Вывод
192+
193+С помощью представленного знания, простые и сложные структуры данных JSON могут быть загружены в ваши программы на Free Pascal. Если необходима какая-либо пред- или постобработка данных JSON, текстовые данные могут быть изначально загружены в структуру данных в формате JSON (классом [[TJSONParser]] из юнита [[jsonparser]]), а затем можно обрабатывать с помощью юнита [[fpJSON]].
194+
195+Опции свойства TJSONStreamer могут быть использованы для управления представлением ваших собственных структур данных в формате JSON.
196+
197+## Смотрите также
198+
199+- [[JSON/ru|JSON]]
200+- [[fcl-json/ru|fcl-json]]
201+- [[Streaming components]]
202+
203+## Примечания & Ссылки
204+
205+1. <div id="ref1">
206+
207+ <http://lists.freepascal.org/fpc-pascal/2013-January/036254.html>
208+
209+ </div>
210+
211+2. \<div id="ref2\>http://lists.lazarus.freepascal.org/pipermail/lazarus/2011-January/058878.html
212+ </div>
213+
214+---
215+*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).*

Back to history