You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 12中DataSnap能否用自定义类作为服务端方法参数接收JSON?

Delphi 12 DataSnap自定义类参数接收JSON的实现方案

Delphi 12的DataSnap完全支持直接使用自定义类作为服务端方法参数,自动接收前端传入的JSON数据,无需手动转换TJsonObject。以下是具体实现步骤和代码示例:

1. 调整自定义类结构

DataSnap的自动序列化依赖RTTI,因此自定义类的成员需要确保能被RTTI识别,最直接的方式是将字段改为published属性,并建议继承TPersistent以获得更好的序列化支持:

type
  TTestParam = class(TPersistent)
  private
    fVal1: Integer;
  published
    property Val1: Integer read fVal1 write fVal1;
  end;

2. 修改服务端方法

直接将方法参数改为自定义类,保持{$METHODINFO ON}开启(这是DataSnap生成元数据、支持自动序列化的必要条件):

{$METHODINFO ON}
TTest = class(TDSServerModule)
strict private
public
  function updateTest(param: TTestParam): TTestParam;
end;
{$METHODINFO OFF}

implementation

function TTest.updateTest(param: TTestParam): TTestParam;
begin
  Result := TTestParam.Create;
  Result.Val1 := param.Val1 * 2;
end;

3. 处理特殊JSON包装结构

如果前端传入的JSON带有额外包装(比如你输出处理时去掉的数组、fields层级),可以在WebDispatcher的BeforeDispatch事件中做反向解析,提取核心数据后替换请求内容,让DataSnap能正确映射到自定义类:

procedure TTest.WebDispatcherBeforeDispatch(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  InputJson: TJSONValue;
  InnerData: TJSONObject;
begin
  // 示例:解析前端传入的包装JSON [{"fields": {"Val1": 10}}]
  InputJson := TJSONValue.ParseJSONValue(Request.Content);
  try
    if InputJson is TJSONArray then
    begin
      InnerData := TJSONObject(TJSONArray(InputJson).Items[0]).GetValue<TJSONObject>('fields');
      Request.Content := InnerData.ToString;
    end;
  finally
    InputJson.Free;
  end;
end;

关键注意事项

  • 必须开启{$METHODINFO ON},否则DataSnap无法识别自定义类参数的元数据
  • 自定义类的成员需为published属性,或通过[JSONName]等注解让RTTI能访问到
  • 若前端JSON结构与自定义类完全匹配,无需额外处理请求,DataSnap会自动完成JSON到类实例的转换

内容的提问来源于stack exchange,提问作者Dżyszla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:50:10