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

