将带有短字符串的 Delphi 记录序列化为JSON时出现问题

gudnpqoy  于 2023-01-27  发布在  其他
关注(0)|答案(1)|浏览(152)

在我们的Delphi XE 10.2.2项目中,有大量短字符串字段的记录。
问题是,当我们使用System.JSON.Serializers单元中的TJsonSerializer时,这些字段被忽略了。
如何将包含短字符串的记录序列化为JSON?
对于AnsiStringString字段,它肯定工作得很好。问题是,就像我之前说的,有很多现有的短字符串记录。
例如:

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上,但我不知道如何避免/修复。

bq3bfh9z

bq3bfh9z1#

事实上,一些Object Pascal类型(如ShortString和Real 48)不被类型信息生成器支持,这可能与 Delphi 类和对象有关,就像文档中提到的:

  • 在类成员的可见性中,可以发布除“Real 48”之外的任何真实的类型。
  • “ShortString”不在可自动化类型之列。

因此,基于RTTI的特性将无法正确处理这些类型,就像JSON序列化器(基于RTTI)无法序列化这些类型的字段一样。
对于“ShortString”的问题,您可以通过定义自己的字符串类型(并稍后在记录中使用)来解决它,如下所示:

type
  string50 = string[50];

  TTestRec = record
    ShortStrData: string50;
  end;.

但请记住,这些类型是为了向后兼容而保留的,特别是移动的编译器不支持的“ShortString”,因此您必须考虑将代码库迁移到最新的Object Pascal/ Delphi 版本。

相关问题