如何在 mORMot 中使用 ObjectToJSON 表示空字符串字段?

问题描述 投票:0回答:1

我正在使用 FreePascal 中的 mORMot 框架将对象序列化为 JSON。我需要在生成的 JSON 中将字符串字段之一表示为 null,而不是空字符串。但是,当使用 ObjectToJSON 函数时,该字段显示为空字符串。

这是我尝试对课程进行的操作的示例:

uses
  SysUtils,
  SynCommons;

type
  TPersonClass = class(TSynPersistent)
  private
    FName: String;
    FAge: Integer;
  published
    property Name: String read FName write FName;
    property Age: Integer read FAge write FAge;
  end;

var
  Person: TPersonClass;
  JSON: RawUTF8;
begin
  Person := TPersonClass.Create;
  try
    Person.Name := ''; // I want this to be null in the JSON
    Person.Age := 30;
    
    JSON := ObjectToJSON(Person, [woHumanReadable]);
    Writeln(JSON);
  finally
    Person.Free;
  end;
end.

当前输出类似于:

{
  "Name": "",
  "Age": 30
}

但我希望 JSON 是:

{
  "Name": null,
  "Age": 30
}

如何调整序列化,使“名称”字段为空而不是空字符串? mORMot 中是否有任何配置或最佳实践来处理此问题?

freepascal mormot
1个回答
0
投票

我找到解决办法了! 要使用 mORMot 表示 JSON 中的空字符串字段,您可以将该属性声明为 Variant 类型。当您希望 JSON 输出中该字段为空时,这允许您显式地将 Null 分配给该字段。

type
TPersonClass = class(TSynPersistent)
  private
    FAge: Integer;
    FName: Variant;
  published
    property Name: Variant read FName write FName;
    property Age: Integer read FAge write FAge;
  end;

你可以这样使用它:

var
 Person: TPersonClass;
  JSON: RawUTF8;
begin
  Person := TPersonClass.Create;
  try
    
    Person.Name := Null; // This will be serialized as null
    //Person.Name := 'Jhon';// Output: { "Name": "Jhon", "Age": 30 }
    Person.Age := 30;
    
    JSON := ObjectToJSON(Person, []);
    Writeln(JSON); // Output: { "Name": null, "Age": 30 }
  finally
    Person.Free;
  end;
end.
© www.soinside.com 2019 - 2024. All rights reserved.