Streaming JSON/ru
│
Deutsch (de) │
English (en) │
polski (pl) │
русский (ru) │
中文(中国大陆) (zh_CN) │
JSON(JavaScript Object Notation) является текстовым, стандартизированным форматом данных. Как следует из названия, JSON документы являются правильным кодом JavaScript, где они могут быть непосредственно преобразованы в объекты JavaScript. Но сам по себе JSON может быть использован независимо от используемого языка программирования для обмена данными.
В этом руководстве объясняется, как загрузить данные в формате JSON в программе Free Pascal для обработки. Оно также объясняет, как преобразовать данные FPC в формате JSON (например, чтобы отправить их на веб-сервер).
Общие положения и условия
Loading and storing (streaming) FPC object data is done with the fpjsonrtti unit. Furthermore, the Classes unit is useful (see below for details). Загрузка и хранение (маршалинг) FPC данных объекта осуществляется с помощью юнита fpjsonrttiN. Кроме того, может пригоlиться Class в юните (см ниже).
В связи с этим оператор USES должен содержать, по крайней мере, эти два юнита:
USES Classes, fpjsonrtti;
В настоящее время (май 2014 г.) есть некоторые отличия от потоковой системы Free Pascal с ??_предположительно_ JavaScript ??:
- Данные в формате JSON чувствительны к регистру. Таким образом, свойства объектов Free Pascal, как свойства JSON должны быть написаны с правильным регистром.
- Нет свойств, которые могут быть определены как DefineProperties. Нельзя сохранить ссылки на методы (обработчики событий).2
- TCollection и TStrings может быть использован в качестве замены массивов.
Демо-версия программы предоставляется с исходным кодом Free Pascal Compiler (в папке /packages/fcl-json/examples).
В качестве примера, мы приведём пример со следующими данными JSON:
{
"id" : 123, // Integer
"объект" : { "имя": "Привет, мир!" }, // Object
"колл" : [ { "имя": "Объект 1" }, { "имя": "Объект 2" } ], // два объекта TCollection
"строки": [ "привет 1", "привет 2" ] // список строк
}
Это может быть выполнено в Free Pascal с использованием констант следующим образом:
const JSON_TESTDATA =
'{'+LineEnding+
' "id": 123,'+LineEnding+
' "объект": { "имя": "Hello world!" },'+LineEnding+
' "колл": [ { "имя": "Объект 1" }, { "имя": "Объект 2" } ],'+LineEnding+
' "строки": [ "привет 1", "привет 2" ]'+LineEnding+
'}';
Структура данных
В качестве базового класса для обслуживания данных существует класс TPersistent из юнита Classes, так как для них и всех подклассов должен быть создан Laufzeit-Typinformationen (RTTI). Это совершенно необходимо для маршаллинга. Поскольку fpjsonrtti не интегрирован в систему маршаллинга, любого другого класса, должна быть указана опция компилятора {$M+}
, для использования.
Все объекты должны быть доступны как property для чтения в разделе класса published. В общем случае (переменная) должна быть доступна для чтения и записи непосредственно в поле данных. Если вы хотите, конечно, могут быть использованы методы getter и setter.
Для структуры JSON результаты определении класса представлены ниже.
TYPE
TNameObject = CLASS(TCollectionItem) // класс для свойства 'obj' и TCollection
PRIVATE
fName: String;
PUBLISHED
property name: String read fName write fName;
END;
TBaseObject = CLASS(TPersistent) // класс для структуры JSON
PRIVATE
fid: Integer;
fObj: TNameObject;
fColl: TCollection;
fStrings: TStrings;
PUBLIC
CONSTRUCTOR Create;
DESTRUCTOR Destroy; override;
PUBLISHED// все свойства должны быть published
PROPERTY id: Integer read fid write fid;
PROPERTY obj: TNameObject read fObj write fObj;
PROPERTY coll: TCollection read fColl;
PROPERTY strings: TStrings read fStrings;
END;
Класс TNameObject
является потомком TCollectionItem. Таким образом, они могут оба для свойства obj использовать коллекции. Если это не желательно, здесь должны быть определены два различных класса.
В конструкторе класса TBaseObject класс TCollection и список строк должен быть создан конструктором и уничтожен в деструкторе.
CONSTRUCTOR TBaseObject.Create;
BEGIN
// конструктор коллекции и StringList
fColl := TCollection.Create(TNameObject);
fStrings := TStringList.Create;
fObj := TNameObject.Create(nil);
END;
DESTRUCTOR TBaseObject.Destroy;
BEGIN
// деструктор коллекции и StringList
fColl.Free;
fStrings.Free;
fObj.Free;
INHERITED Destroy;
END;
If you do not want any more functionality in the data classes, their definition is already done. Если вы не хотите больше функций для данных классов, их определение закончено.
Загрузка JSON
With the method Procedure JSONToObject(Const JSON : TJSONStringType; AObject : TObject);
in the TJSONDeStreamer class you can assign JSON data directly to an existing object. Before you call the method, you must create TJSONDeStreamer and the target object.
The following method loads the data from the JSON structure JSON_TESTDATA
in the o object and then writes the current values of the properties on the console.
procedure DeStreamTest;
var
DeStreamer: TJSONDeStreamer;
o: TBaseObject;
no: TNameObject;
s: String;
begin
WriteLn('DeStream test');
WriteLn('======================================');
// DeStreamer object and target object create
DeStreamer := TJSONDeStreamer.Create(nil);
o := TBaseObject.Create;
try
// Load JSON data in the object o
DeStreamer.JSONToObject(JSON_TESTDATA, o);
// ID
WriteLn(o.id);
// Object Name
WriteLn(o.obj.name);
// Print the names of all objects
for TCollectionItem(no) in o.coll do
Writeln(no.name);
// output all strings
for s in o.strings do
WriteLn(s);
// Cleanup
finally
o.Destroy;
DeStreamer.Destroy;
end;
end;
Saving JSON
Для преобразования объекта в текст JSON, используется класс TJSONStreamer. Здесь используется метод FUNCTION ObjectToJSONString(AObject : TObject) : TJSONStringType;
.
В следующей процедуре, объект создается, заполняется данными теста, а затем преобразуются в формат JSON. Порядок, в котором сохраняются свойства не могут зависеть от программиста.
И, наконец, текст JSON выводится на консоль.
PROCEDURE StreamTest;
VAR
Streamer: TJSONStreamer;
o: TBaseObject;
JSONString: String;
BEGIN
WriteLn('Stream test');
WriteLn('======================================');
Streamer := TJSONStreamer.Create(nil);
o := TBaseObject.Create;
TRY
// установка данных
o.id := 123;
o.obj.name := 'Привет, мир!';
TNameObject(o.coll.Add).name := 'Объект 1';
TNameObject(o.coll.Add).name := 'Объект 2';
o.strings.Add('Привет 1');
o.strings.Add('Привет 2');
Streamer.Options := Streamer.Options + [jsoTStringsAsArray]; // сохранение строки в JSON
// конвертация вывод и JSON
JSONString := Streamer.ObjectToJSONString(o);
WriteLn(JSONString);
// очистка
FINALLY
o.Destroy;
Streamer.Destroy;
END;
END;
Вывод
С помощью представленного знания, простые и сложные структуры данных JSON могут быть загружены в ваши программы на Free Pascal. Если необходима какая-либо пред- или постобработка данных JSON, текстовые данные могут быть изначально загружены в структуру данных в формате JSON (классом TJSONParser из юнита jsonparser), а затем можно обрабатывать с помощью юнита fpJSON.
Опции свойства TJSONStreamer могут быть использованы для управления представлением ваших собственных структур данных в формате JSON.