首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mormot将泛型TList序列化为JSON

如何使用mormot将泛型TList序列化为JSON
EN

Stack Overflow用户
提问于 2018-02-28 17:13:14
回答 1查看 651关注 0票数 1

我想使用mORMot框架将通用TList序列化为JSON。

我知道有一个TDynList有一个很方便的方法叫做SaveToJSON,但是它不适合我。

这是我的简单演示:

代码语言:javascript
复制
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Generics.Collections, SynCommons, SynDB, SynDBODBC, mORMot, mORMotSQLite3;

const
  CONN_STR =
    'Driver=MySQL ODBC 5.3 UNICODE Driver;Database=test;Server=127.0.0.1;Port=3306;UID=root;Pwd=';

type
  TRows = TList<Variant>;

  TDbService = class
    constructor Create(const ConnStr: RawUTF8); overload;
    destructor Destroy; override;
  protected
    fConnStr: RawUTF8;
    fProps: TODBCConnectionProperties;
    function GetConnection: TODBCConnectionProperties;
    function Query(const Sql: RawUTF8; const Params: array of const): TRows;
  public
    function GetSpecificUserList(Offset, Limit: Integer): TRows;
  end;

{ TDbService }

constructor TDbService.Create(const ConnStr: RawUTF8);
begin
  fConnStr := ConnStr;
end;

destructor TDbService.Destroy;
begin
  inherited;
end;

function TDbService.GetConnection: TODBCConnectionProperties;
begin
  Result := TODBCConnectionProperties.Create('', fConnStr, '', '');
end;

function TDbService.Query(const Sql: RawUTF8; const Params: array of const): TRows;
var
  Props: TODBCConnectionProperties;
  Row: ISQLDBRows;
  V: Variant;
begin
  Props := GetConnection;
  Result := TRows.Create;
  try
    try
      Row := Props.Execute(Sql, Params);
      while Row.Step do
      begin
        Row.RowDocVariant(V);
        Result.Add(Row);
      end;
    except
      FreeAndNil(Result);
      raise
    end;
  finally
    Props.Free;
  end;
end;

function TDbService.GetSpecificUserList(Offset, Limit: Integer): TRows;
begin
  // It calls a stored procedure, the Result will be a TList<Variant> .
  // Each Variant has properties like name, age, etc. as it's an User representation but not from any existed table) .
  Result := Query('CALL GetSpecUserList_P(?, ?)', [Offset, Limit]);
end;


{ Main }

procedure Main;
var
  DbService: TDbService;
  Rows: TList<Variant>;
begin
  DbService := TDbService.Create(CONN_STR);
  try
    Rows := DbService.GetSpecificUserList(0, 100);
    // How to serialize `Rows` to a JSON string? I'm not using TDynList because it could only hold of records, but not Variant.
  finally
    DbService.Free;
  end;
end;

begin
  Main;
end.

如何将Rows转换为JSON字符串?我没有使用TDynList,因为它只能保存记录,而不能保存变量。

任何帮助都将非常感谢,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 10:08:03

最后,我写了一个类似这样的工具函数:

代码语言:javascript
复制
function VariantListToJson(const List: TList<Variant>): RawUTF8;
var
  Item: Variant;
  S: RawUTF8;
begin
  Result := '[';
  for Item in List do
  begin
    S := VariantSaveJSON(Item);
    Result := Result + S + ',';
  end;
  if Result <> '[' then
    Delete(Result, Length(Result), 1);
  Result := Result + ']';
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49025800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档