当值为整数时无法将小数部分显示为 .0

Can't show fractional part as .0 when value is a whole number

案例如下:

uses
  System.JSON;
     
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  dd:Double;
  aJsonObj:TJSONObject;
begin
  dd := 100.0;
  aJsonObj := TJSONObject.Create(TJSONPair.Create('DecimalValue',TJSONNumber.Create(dd)));
  ShowMessage(aJsonObj.ToString);
end;

显示

{"DecimalValue":100}

我需要的是

{"DecimalValue":100.0}

我试过更改 JsonFormatSettings 但找不到添加小数部分的方法。

其中一个 TJSONNumber constructors 接受原始字符串值,该值将用于结果 JSON 字符串,无需进一步处理。它允许您 pre-format 自己的价值:

procedure TForm1.Button1Click(Sender: TObject);
var
  dd: Double;
  aJsonObj: TJSONObject;
begin
  dd := 100.0;
  aJsonObj := TJSONObject.Create(
    TJSONPair.Create('DecimalValue', TJSONNumber.Create(FormatFloat('0.0###', dd, GetJSONFormat))));
  try
    ShowMessage(aJsonObj.ToString);
  finally
    aJsonObj.Free;
  end;
end;

使用上面的代码片段,值显示为:

{"DecimalValue":100.0}

您甚至可以创建 'whatever' 作为数字:

aJsonObj := TJSONObject.Create(TJSONPair.Create('DecimalValue', TJSONNumber.Create('whatever')));

得到这个(无效)JSON:

{"DecimalValue":whatever}

旁注:您有责任释放您创建的根 JSON 对象,因为它们没有父对象来管理它们的生命周期。正如您在第一个代码片段中所见,使用 try..finallyFree 根对象。太糟糕了,the documentation 本身会诱使您不进行清理。