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
相关产品推荐
相关产品推荐

