Есть ли у кого-нибудь пример сериализации JSON туда и обратно в Delphi XE6?

Я хочу закодировать (как мне кажется, простую) сериализацию объекта туда и обратно в Delphi. Но я не могу понять, как это сделать в/из JSON. Я могу и уже некоторое время делаю это с помощью XML.

Однако пример и объяснение, которые я нашел в стандартных документах Embarcadero, например. локальная помощь, DocWiki и т. д. мне мало чем помогли.

Предпочтительно, я ищу реально работающий пример, с использованием собственных библиотек или компонентов XE(6) -- но , я был бы признателен за ссылки на любые записи (документы, статьи, публикации и т. д.) и/или любые другие библиотеки, которые кто-либо использовал для работы.


person Community    schedule 16.08.2014    source источник
comment
Предлагаем прочитать, Сериализация пользовательских объектов. Должен ответить на ваш вопрос, используя библиотеку JSON Delphi. Другие альтернативы см. в библиотеке Delphi JSON для XE2. доступны для сериализации объектов.   -  person LU RD    schedule 16.08.2014
comment
Да... Я уже проверил это. тх.   -  person    schedule 29.08.2014


Ответы (1)


Я бы избегал использования нативного фреймворка, основная причина в том, что он сериализует частные члены объектов, что, как мне кажется, нарушает принципы инкапсуляции ООП. Имхо правильнее было бы сериализовать опубликованные свойства классов. Это нарушает совместимость с другими языками.

В любом случае, вот базовый пример.

implementation

uses
  Serializable,
  REST.JsonReflect,
  System.Json,
  System.SysUtils;


{ TMain }

procedure TMain.Run;
var
  mySerializable: TMySerializable;
  marshaller: TJSONMarshal;
  unMarshaller: TJSONUnMarshal;
  jsonValue: TJSONValue;
begin
  mySerializable := TMySerializable.Create;
  mySerializable.MyInt := 42;
  mySerializable.MyString := 'The Answer';
  // Serialize
  marshaller := TJSONMarshal.Create;
  jsonValue := marshaller.Marshal(mySerializable);
  marshaller.Free;
  mySerializable.Free;
  mySerializable := nil;
  WriteLn('JSon value:');
  WriteLn(jsonValue.ToString);
  // Deserialize
  unMarshaller := TJSONUnMarshal.Create;
  mySerializable := TMySerializable(unMarshaller.CreateObject(TMySerializable, TJSONObject(jsonValue)));
  WriteLn('mySerializable.MyInt: ' + IntToStr(mySerializable.MyInt));
  WriteLn('mySerializable.MyString: ' + mySerializable.MyString);

  jsonValue.Free;
  mySerializable.Free;
  unMarshaller.Free;
  ReadLn;

end;

А модуль Serializable определяет простой тестовый класс.

unit Serializable;

interface

uses
  System.Classes;

type
  TMySerializable = class(TPersistent)
  private
    FMyString: string;
    FMyInt: Integer;
  published
    property MyInt: Integer read FMyInt write FMyInt;
    property MyString: string read FMyString write FMyString;
  end;

implementation

end.
person Anders E. Andersen    schedule 18.08.2014
comment
Контроль доступа — это функция времени компиляции. Все поля могут быть релевантными и обязательными для отображения состояния объекта. Java и другие языки используют аннотации, чтобы указать, какие поля должны (не) сериализоваться. - person mjn; 18.08.2014