уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Дело было вечером. Делать было нечего. Решил посмотреть в Сети, что происходит в мире 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 может работать в двух вариантах:

  1. Для массива JSON в родительском классе может быть объявлено поле типа TArray
  2. Для массива 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.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
1 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Andrey Sovtsov
08/05/2019 21:17

Влад, здравствуйте! Был бы очень признателен, если бы вы связались со мной в Скайпе (если еще пользуетесь) или WhatsApp (+79166247001)