Delphi 如何使用mormot将通用TList序列化为JSON

Delphi 如何使用mormot将通用TList序列化为JSON,delphi,mormot,Delphi,Mormot,我想使用mORMot框架将通用的TList序列化为JSON 我知道有一个TDynList,它有一个叫做SaveToJSON的方便方法,但它不适合我 这是我的简单演示: program Project3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Generics.Collections, SynCommons, SynDB, SynDBODBC, mORMot, mORMotSQLite3; const

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

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

这是我的简单演示:

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.
程序项目3;
{$APPTYPE控制台}
{$R*.res}
使用
System.SysUtils、System.Generics.Collections、syncomons、SynDB、syndbcodbc、mORMot、mORMotSQLite3;
常数
康努街=
'Driver=MySQL ODBC 5.3 UNICODE驱动程序;数据库=测试;服务器=127.0.0.1;端口=3306;UID=根;Pwd=';
类型
TRows=TList;
TDbService=class
构造函数创建(const ConnStr:RawUTF8);超载;
毁灭者毁灭;推翻
受保护的
fConnStr:RawUTF8;
fProps:TODBCConnectionProperties;
函数GetConnection:TODBCConnectionProperties;
函数查询(constsql:RawUTF8;constparams:const数组):TRows;
公众的
函数GetSpecificUserList(偏移量,限制:整数):TRows;
结束;
{TDbService}
构造函数TDbService.Create(constconnstr:RawUTF8);
开始
fConnStr:=ConnStr;
结束;
析构函数TDbService.Destroy;
开始
继承;
结束;
函数TDbService.GetConnection:TODBCConnectionProperties;
开始
结果:=TODBCConnectionProperties.Create(“”,fConnStr,“”);
结束;
函数TDbService.Query(constsql:RawUTF8;constparams:const数组):TRows;
变量
道具:TODBCConnectionProperties;
行:ISQLDBRows;
V:变体;
开始
道具:=GetConnection;
结果:=TRows.Create;
尝试
尝试
行:=Props.Execute(Sql,Params);
边划边做
开始
Row.RowDocVariant(V);
结果。添加(行);
结束;
除了
FreeAndNil(结果);
提升
结束;
最后
道具。免费;
结束;
结束;
函数TDbService.GetSpecificUserList(偏移量,限制:整数):TRows;
开始
//它调用一个存储过程,结果将是一个TList。
//每个变体都有名称、年龄等属性,因为它是用户表示,但不来自任何现有表)。
结果:=Query('CALL GetSpecUserList_P(?,),[Offset,Limit]);
结束;
{Main}
主程序;
变量
DbService:TDbService;
行:TList;
开始
DbService:=TDbService.Create(CONN_STR);
尝试
行:=DbService.GetSpecificUserList(01100);
//如何将“Rows”序列化为JSON字符串?我不使用TDynList,因为它只能保存记录,而不能保存变体。
最后
DbService.Free;
结束;
结束;
开始
主要的;
结束。
如何将
转换为JSON字符串?我不使用TDynList,因为它只能保存记录,而不能保存变体


非常感谢您的帮助。

最后,我编写了一个工具函数,如下所示:

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;
函数VariantListToJson(const List:TList):RawUTF8;
变量
项目:变体;
S:RawUTF8;
开始
结果:='[';
对于列表中的项目,请执行以下操作:
开始
S:=VariantSaveJSON(项目);
结果:=结果+S+',';
结束;
如果结果为“[”,则
删除(结果,长度(结果),1);
结果:=结果+']';
结束;

请说明否决投票的原因,这将有助于我下次改进我的问题。谢谢。