如何在Delphi中打印JSON?

时间:2013-08-29 12:42:45

标签: json delphi formatting pascal pretty-print

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

实施例: 我有输入行:

{"menu": {"header": "JSON viewer", "items": [{"id": "Delphi"},{"id": "Pascal", "label": "Nice tree format"}, null]}}

希望以文字形式获得可读的结果:

{
   "menu":{
      "header":"JSON viewer",
      "items":[
       {
         "id":"Delphi"
       },
       {
         "id":"Pascal",
         "label":"Nice tree format"
       },
       null
      ]
   }
}

我发现了许多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;

5 个答案:

答案 0 :(得分:9)

如果您不想使用任何外部库,并且您正在使用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;

答案 1 :(得分:5)

使用superobject库,确保使用the latest version from the repository file, not the 1.2.4 ZIP

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

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

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

答案 2 :(得分:4)

您也可以使用我们的开源SynCommons.pas单元的following methods

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

此处new将包含:

{
  "menu": {
    "header": "JSON viewer",
    "items": 
    [
      {
        "id": "Delphi"
      },
      {
        "id": "Pascal",
        "label": "Nice tree format"
      },
      null
    ]
  }
}

如果您使用jsonUnquotedPropName格式:

  new := JSONReformat(json,jsonUnquotedPropName);

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

{
  menu: {
    header: "JSON viewer",
    items: 
    [
      {
        id: "Delphi"
      },
      {
        id: "Pascal",
        label: "Nice tree format"
      },
      null
    ]
  }
}

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

请注意,我们的JSONReformat()功能非常快。它在1.4秒内将巨大的190 MB不可格式JSON内容从CityLots转换为400 MB的美化JSON(用于和用于行字段)。 SuperObject 只能在10秒内读取它,并且仅使用1.1 GB来存储190 MB的内容。并且DBXJSON甚至无法加载数据:它消耗所有32位内存 - 在Win64(XE6)下,它需要50秒并使用3 GB的RAM来读取190 MB的JSON。请参阅this article for some numbers

答案 3 :(得分:1)

如果您正在使用Delphi XE或更新版本,则可以使用delphi-xe-json

function PrettyPrint (aJSON : string) : string;
var
  jo : IJSONObject
begin
  jo := TJSON.NewObject(aJSON);
  result := jo.ToString(true);
end;

答案 4 :(得分:1)

这有点旧,但是如果有人感兴趣,Delphi的本机System.JSON单元也可以这样做。 Sample使用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;