Дело было вечером. Делать было нечего. Решил посмотреть в Сети, что происходит в мире Delphi, почитать последние статьи, посмотреть, чем интересуется народ. И наткнулся на довольно любопытный и, на мой взгляд, достаточно полезный инструмент под названием JSONToDelphi. Как понятно из названия, цель работы инструмента — создание классов Delphi по строке JSON.
jsontodelphi.com
Онлайн-приложение https://jsontodelphi.com/ выглядит очень аскетично (что хорошо) — по сути, всего два элемента управления: текстовый редактор и пара кнопок:
Посмотрим как работает сервис. Для начала, воспользуемся простеньким JSON из одной из последних статей, посвященных JSON в Delphi:
{ "Привет": "мир!", "MinKey": "MinKey", "MaxKey": "MaxKey", "NullPair": null, "UndefinedPair": "undefined" }
Пишем этот JSON в jsontodelphi.com, жмем кнопку «Generate» и получаем вот такой готовый модуль Delphi:
Код модуля:
unit RootUnit; {******************************************************************************* Generated By : JsonToDelphiClass - 0.65 Project link : https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass Generated On : 2019-05-07 14:05:03 Created By : Petar Georgiev - (http://pgeorgiev.com) Adapted Web By : Marlon Nardi - (http://jsontodelphi.com) *******************************************************************************} interface uses Generics.Collections, Rest.Json; type TRootClass = class private FMaxKey: String; FMinKey: String; FUndefinedPair: String; FПривет: String; public property MaxKey: String read FMaxKey write FMaxKey; property MinKey: String read FMinKey write FMinKey; property UndefinedPair: String read FUndefinedPair write FUndefinedPair; property Привет: String read FПривет write FПривет; function ToJsonString: string; class function FromJsonString(AJsonString: string): TRootClass; end; implementation {TRootClass} function TRootClass.ToJsonString: string; begin result := TJson.ObjectToJsonString(self); end; class function TRootClass.FromJsonString(AJsonString: string): TRootClass; begin result := TJson.JsonToObject(AJsonString) end; end.
Созданный класс содержит два метода:
- FromJsonString — создание экземпляра класса Delphi по Json-строке;
- ToJsonString — создание Json-строки из экземпляра класса.
Модуль можно переименовать и скачать, нажав «Download». Проверим работу модуля в приложении. Я накидал вот такое простенькое приложение:
Обработчики событий OnClick кнопок «FromJsonString» и «JsonToObject» следующие:
procedure TForm9.btnFromJsonStringClick(Sender: TObject); var Root: TRootClass; begin Root := TRootClass.FromJsonString(Memo1.Text); try Edit1.Text := Root.MinKey; Edit2.Text := Root.MaxKey; Edit3.Text := Root.UndefinedPair; Edit4.Text := Root.Prv; finally FreeAndNil(Root); end; end; procedure TForm9.Button2Click(Sender: TObject); var Root: TRootClass; begin Root:=TRootClass.Create; try Root.MaxKey:=Edit2.Text; Root.MinKey:=Edit1.Text; Root.UndefinedPair:=Edit3.Text; Root.Prv:=Edit4.Text; Memo1.Lines.Clear; Memo1.Text:=Root.ToJsonString; finally FreeAndNil(Root); end; end;
Теперь можно запустить приложение и убедиться, что объявленные в классе методы прекрасно работают.
Теперь посмотрим, как справится сервис с более сложным JSON, например, с таким:
{ "kind":"tasks#task", "title":"Новая задача", "links": [ { "type":"href", "description":"desc", "link":"http://webdelphi.ru" } , { "type":"href2", "description":"desc", "link":"http://webdelphi.ru" } ] }
С такими JSON сервис JsonToDelphi может работать в двух вариантах:
- Для массива JSON в родительском классе может быть объявлено поле типа TArray
- Для массива JSON в родительском классе может быть объявлено поле типа TObjectList
Переключить вариант работы с массивами json можно, используя вторую кнопку:
В случае использования варианта с TArray, сгенерированный модуль будет выглядеть следующим образом:
unit RootUnit; {******************************************************************************* Generated By : JsonToDelphiClass - 0.65 Project link : https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass Generated On : 2019-05-07 14:35:13 Created By : Petar Georgiev - (http://pgeorgiev.com) Adapted Web By : Marlon Nardi - (http://jsontodelphi.com) *******************************************************************************} interface uses Generics.Collections, Rest.Json; type TLinksClass = class private FDescription: String; FLink: String; FType: String; public property description: String read FDescription write FDescription; property link: String read FLink write FLink; property &type: String read FType write FType; function ToJsonString: string; class function FromJsonString(AJsonString: string): TLinksClass; end; TRootClass = class private FKind: String; FLinks: TArray<tlinksclass>; FTitle: String; public property kind: String read FKind write FKind; property links: TArray</tlinksclass><tlinksclass> read FLinks write FLinks; property title: String read FTitle write FTitle; destructor Destroy; override; function ToJsonString: string; class function FromJsonString(AJsonString: string): TRootClass; end; implementation {TLinksClass} function TLinksClass.ToJsonString: string; begin result := TJson.ObjectToJsonString(self); end; class function TLinksClass.FromJsonString(AJsonString: string): TLinksClass; begin result := TJson.JsonToObject</tlinksclass><tlinksclass>(AJsonString) end; {TRootClass} destructor TRootClass.Destroy; var LlinksItem: TLinksClass; begin for LlinksItem in FLinks do LlinksItem.Free; inherited; end; function TRootClass.ToJsonString: string; begin result := TJson.ObjectToJsonString(self); end; class function TRootClass.FromJsonString(AJsonString: string): TRootClass; begin result := TJson.JsonToObject<trootclass>(AJsonString) end; end.</trootclass></tlinksclass>
Соответственно, работать с классами можно точно также, как и в примере выше. Аналогичным образом можно генерировать классы Delphi по строке JSON, содержащий вложенные объекты, массивы и так далее. Справедливое ограничение одно — JSON должен быть полностью валидным. Нашелся и один небольшой косячок — в самом первом примере одно из полей имело название на кириллице — вот это самое поле в Delphi превратилось из FПривет в F????? и, в результате, пришлось внести небольшую правку в TRootClass. В целом же сервис JsonToDelphi очень даже неплохой и удобный, особенно, когда надо быстренько реализовать API какого-нибудь сервиса в Delphi.
Влад, здравствуйте! Был бы очень признателен, если бы вы связались со мной в Скайпе (если еще пользуетесь) или WhatsApp (+79166247001)