在我们的Delphi XE 10.2.2项目中,有大量短字符串字段的记录。
问题是,当我们使用System.JSON.Serializers
单元中的TJsonSerializer
时,这些字段被忽略了。
如何将包含短字符串的记录序列化为JSON?
对于AnsiString
和String
字段,它肯定工作得很好。问题是,就像我之前说的,有很多现有的短字符串记录。
例如:
type
TTestRec = record
ShortStrData: string[50];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
oSerializer: TJsonSerializer;
r: TTestRec;
begin
r.ShortStrData := 'short string text';
oSerializer := TJsonSerializer.Create;
try
Memo1.Text := oSerializer.Serialize(r);
finally
oSerializer.Free;
end;
end;
结果是:
{}
如果我们将string[50]
替换为AnsiString
,则结果如预期:
{"ShortStrData":"short string text"}
我认为问题出在RTTI上,但我不知道如何避免/修复。
1条答案
按热度按时间bq3bfh9z1#
事实上,一些Object Pascal类型(如ShortString和Real 48)不被类型信息生成器支持,这可能与 Delphi 类和对象有关,就像文档中提到的:
因此,基于RTTI的特性将无法正确处理这些类型,就像JSON序列化器(基于RTTI)无法序列化这些类型的字段一样。
对于“ShortString”的问题,您可以通过定义自己的字符串类型(并稍后在记录中使用)来解决它,如下所示:
但请记住,这些类型是为了向后兼容而保留的,特别是移动的编译器不支持的“ShortString”,因此您必须考虑将代码库迁移到最新的Object Pascal/ Delphi 版本。