如何在Delphi中打印JSON?

And*_*rov 7 delphi formatting json pascal pretty-print

我正在寻找一个函数,它将一串JSON作为输入,并使用换行符和缩进(制表符)对其进行格式化.

示例:我有输入行:

{"menu": {"header": "JSON viewer", "items": [{"id": "Delphi"},{"id": "Pascal", "label": "Nice tree format"}, null]}}
Run Code Online (Sandbox Code Playgroud)

并希望以文本形式获得可读结果:

{
   "menu":{
      "header":"JSON viewer",
      "items":[
       {
         "id":"Delphi"
       },
       {
         "id":"Pascal",
         "label":"Nice tree format"
       },
       null
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

我发现了许多PHP和C#的例子,但不是Delphi.有人可以帮助这样的功能吗?

更新 - 使用SuperObject的解决方案:

function FormatJson (InString: WideString): string; // Input string is "InString"
var
  Json : ISuperObject;
begin
  Json := TSuperObject.ParseString(PWideChar(InString), True);
  Result := Json.AsJson(true, false); //Here comes your result: pretty-print JSON
end;
Run Code Online (Sandbox Code Playgroud)

Bob*_*Bob 11

如果您不想使用任何外部库,并且您使用的是delphi XE5或更新版本,则TJson.Format()REST.Json设备中有一个非常方便的功能.

uses json, REST.Json;

{ ... }    

function FormatJSON(json: String): String;
var
  tmpJson: TJsonObject;
begin
  tmpJson := TJSONObject.ParseJSONValue(json);
  Result := TJson.Format(tmpJson);

  FreeAndNil(tmpJson);
end;
Run Code Online (Sandbox Code Playgroud)

  • 在 Tokio 中 tmpJson 必须是 TJsonValue: `function FormatJSON(json: String): String; var tmpJson: TJsonValue; 开始 tmpJson := TJSONObject.ParseJSONValue(json); 结果:= TJson.Format(tmpJson); FreeAndNil(tmpJson); 结束;` (2认同)

小智 6

这有点老了,但如果有人感兴趣,Delphi 的本机 System.JSON 单元也可以做到这一点。示例使用 TMemo 和 TButton 来格式化 JSON

procedure TForm1.btnFormatJSONClick(Sender: TObject);
const
 DEF_INDENT = 2;
var
 JO : TJSONObject;
begin
 try
  JO := TJSONObject.ParseJSONValue(memoJSON.Text) as TJSONObject;
  memoJSON.Text := JO.Format(DEF_INDENT);
 except
  on E:Exception do
   begin
    MessageDlg('Error in JSON syntax', mtError, [mbOK], 0);
   end;
 end;
end;
Run Code Online (Sandbox Code Playgroud)


Jan*_*gen 5

使用superobject库,确保使用存储库文件中的最新版本,而不是1.2.4 ZIP.

然后你可以格式化你的TSuperObject对象.AsJSON(true)('true'可以解决这个问题).

[请注意,您无法控制显示JSON字段的顺序]

[并从字符串创建您的对象:var lJSON : ISuperObject; lJSON := SO(string);]


Arn*_*hez 5

您也可以使用我们的开源单元的以下方法SynCommons.pas

var json,new: RawUTF8;
begin
  json := '{"menu": {"header": "JSON viewer", "items": [{"id": "Delphi"},{"id": "Pascal", "label": "Nice tree format"}, null]}}';
  new := JSONReformat(json,jsonHumanReadable);
  ...
Run Code Online (Sandbox Code Playgroud)

这里new将包含:

var json,new: RawUTF8;
begin
  json := '{"menu": {"header": "JSON viewer", "items": [{"id": "Delphi"},{"id": "Pascal", "label": "Nice tree format"}, null]}}';
  new := JSONReformat(json,jsonHumanReadable);
  ...
Run Code Online (Sandbox Code Playgroud)

如果使用以下jsonUnquotedPropName格式:

  new := JSONReformat(json,jsonUnquotedPropName);
Run Code Online (Sandbox Code Playgroud)

您将获得以下扩展语法(类似于JavaScriptMongoDB Shell中使用的语法):

{
  "menu": {
    "header": "JSON viewer",
    "items": 
    [
      {
        "id": "Delphi"
      },
      {
        "id": "Pascal",
        "label": "Nice tree format"
      },
      null
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

此语法可作为我们开源框架所有JSON函数的有效输入,可以替代默认JSON语法。我们发现它非常有用,例如用于配置文件。

请注意,我们的JSONReformat()功能非常快。它将在1.4秒内将来自CityLots的 190 MB巨大的无法格式化的 JSON内容转换为400 MB的美化JSON(预期并带有行字段)。SuperObject能够在10秒内读取它,并使用1.1 GB来存储190 MB的内容。而且DBXJSON甚至无法加载数据:它消耗了所有32位内存-在Win64(XE6)下,它需要50秒并使用3 GB的RAM来读取190 MB的JSON。有关一些数字,请参见本文