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

Delphi使用Rest.JSON反序列化简单类时TArray数组为空问题排查

问题根因

这个问题是Delphi JSON序列化框架的常见场景,核心原因分为两类:

  • 大小写匹配问题:TJson.ObjectToJsonString默认会自动将类字段名转换为驼峰格式(首字母小写),你序列化得到的JSON键为servers,如果反序列化配置为区分大小写,就无法匹配类中大写开头的Servers字段,导致字段未被赋值保持为空。
  • 嵌套类数组的识别问题:旧版本REST.Json.TJson无法自动识别动态数组TArray<TServer>的元素为自定义类类型,反序列化时不会自动分配数组长度、创建元素实例,最终得到空数组。

解决方法

方案1:添加序列化特性显式声明(兼容性最好)

首先引用REST.Json.Types单元,给字段添加特性明确映射规则:

uses REST.Json.Types;

TServer = class
public
  [JSONName('host')]
  Host: string;
end;

TServerList = class
public
  [JSONName('servers')]
  [JSONArrayItemType(TypeInfo(TServer))]
  Servers: TArray<TServer>;
end;

修改后无需调整原有序列化、反序列化调用代码即可正常运行。

方案2:关闭自动驼峰命名转换

序列化时指定参数关闭驼峰转换,让JSON键名与类字段名完全一致:

// 最后一个参数设为False代表关闭驼峰命名转换
var Json := TJson.ObjectToJsonString(SrvLst, [], jsoDefault, False);
var SrvLst2 := TJson.JsonToObject<TServerList>(Json);

方案3:Delphi 10.4+ 新序列化器配置

如果你使用System.JSON.Serializers下的新序列化器,开启大小写不敏感配置即可:

var Serializer := TJsonSerializer.Create;
try
  Serializer.Options.PropertyNameCaseInsensitive := True;
  var Json := Serializer.Serialize(SrvLst);
  var SrvLst2 := Serializer.Deserialize<TServerList>(Json);
finally
  Serializer.Free;
end;

内容的提问来源于stack exchange,提问作者Laurent Meyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:03