Ответить на комментарий

Примеры использования JSON в Synopse mORMot Framework

Февраль 27, 2013 — Шарахов А.П.

Поддержка JSON довольно сильно интегрирована в mORMot. Возможности сериализации весьма широки, хотя не все из них находятся на поверхности.

Замечательно, что сериализация объектов в mORMot построена на основе RTTI, даже для старых версий Delphi. Сериализуемые свойства объектов должны быть объявлены как published.

Сериализация простых свойств (число, дата, строка, булевский тип) выполняется автоматически и каких-либо cложностей не представляет.

Сериализация структурных свойств (запись, массив записей и массив значений) также выполняется автоматически, но по умолчанию происходит их преобразование в Base64-строку. Если требуется получить читаемое представление, то надо написать несложные функции обратного вызова Reader/Writer или использовать массивы предопределенных типов.

В прилагаемом исходнике я специально не использовал предопределенные типы массивов для того, чтобы продемонстрировать возможность переключения представления данных.

Также обратите внимание, что перед десериализацией JSON-строка предварительно копируется в промежуточный буфер. Это необходимо, т.к. данные в буфере изменяются при десериализации.

      SetString(s,pchar(pointer(JsonString)),Length(JsonString));
      JsonToObject(List, pointer(s), isValid);

Если JSON-строка после десериализации в программе не используется, то этот код можно сократить:

      JsonToObject(List, pointer(JsonString), isValid);

Немного покопавшись во внутренностях mORMot, можно обнаружить даже способ сериализации обычных записей или массивов записей. Как и при работе с объектами, в этом случае удается получить представление полей записи и в виде упорядоченного массива неименованных значений, и в виде AV-пар.

Добавление

Если ваш SynCommons.pas датирован 28.02.2013 или позднее, то вы можете немного упростить сериализацию массивов записей, например:

procedure TForm1.bRecordArrayToJsonClick(Sender: TObject);
var
  ra: TDynRecordArray;
  wr: TTextWriter;
  i: integer;
begin;
  SetLength(ra,5);
  for i:=0 to Length(ra)-1 do FillRecord(ra[i], i);
 
  wr:=TTextWriter.CreateOwnedStream;
  try
    wr.AddDynArrayJson(TypeInfo(TDynRecordArray),ra);
    JsonString:=wr.Text;
  finally
    wr.Free;
    end;
 
  Memo1.Text:=UTF8ToString(JsonString);
  end;
 
procedure TForm1.bRecordArrayFromJsonClick(Sender: TObject);
var
  ra: TDynRecordArray;
  isValid: boolean;
  s: RawUTF8;
  i: integer;
begin;
  Memo2.Lines.Clear;
 
  if JsonString<>'' then begin;
    SetString(s,pchar(pointer(JsonString)),Length(JsonString));
    isValid:=DynArrayLoadJSON(ra,pointer(s),TypeInfo(TDynRecordArray))<>nil;
    if not isValid then Memo2.Lines.Text:='invalid JSON string'
                   else for i:=0 to Length(ra)-1 do ShowRecord(ra[i], Memo2);
    end;
  end;

на главную

Прикрепленный файлРазмер
JsonProj.zip6.04 кб

Ответить

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <h1> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <pre>, <code>, <asm>, <c>, <cpp>, <delphi>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>, <mytext>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Подробнее о форматировании

CAPTCHA
Ведите текст с изображения. (вводить еще раз после предпросмотра а то не добавится комментарий)
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.