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)
小智 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)
使用superobject库,确保使用存储库文件中的最新版本,而不是1.2.4 ZIP.
然后你可以格式化你的TSuperObject对象.AsJSON(true)('true'可以解决这个问题).
[请注意,您无法控制显示JSON字段的顺序]
[并从字符串创建您的对象:var lJSON : ISuperObject; lJSON := SO(string);]
您也可以使用我们的开源单元的以下方法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)
您将获得以下扩展语法(类似于JavaScript或MongoDB 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。有关一些数字,请参见本文。
| 归档时间: |
|
| 查看次数: |
8145 次 |
| 最近记录: |