我正在寻找一个函数,它将一串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;
答案 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;