158 lines
4.0 KiB
ObjectPascal
158 lines
4.0 KiB
ObjectPascal
{格式化 JSON 单元
|
|
}
|
|
unit uFomat_JSON;
|
|
|
|
interface
|
|
uses
|
|
system.JSON,
|
|
System.SysUtils, System.Variants, System.Classes;
|
|
|
|
|
|
const
|
|
Level_indent = 2;
|
|
|
|
|
|
//格式化 JSON 字符串
|
|
// JSONStr : 表示需要格式化的 JSON字符串
|
|
// lv : 表示缩进层级
|
|
function JSON_Format(JSONStr : string; lv : Word = 0) : string;
|
|
|
|
|
|
//格式化数组, 缩进
|
|
function JSON_Fromat_Array(ja : TJSONArray; lv : word = 0) : string;
|
|
|
|
//跨过的indent
|
|
function LI(lv : Word) : string;
|
|
|
|
|
|
implementation
|
|
|
|
//格式化 JSON 字符串
|
|
// JSONStr : 表示需要格式化的 JSON字符串
|
|
// Left_Space : 表示左边统一留多少个空格
|
|
// Level_index :表示每级缩进多个个空格
|
|
function JSON_Format(JSONStr : string; lv : Word = 0) : string;
|
|
var
|
|
S : string;
|
|
jo : TJSONObject;
|
|
jo1: TJSONObject;
|
|
jp : TJSONPair;
|
|
js : TJSONString;
|
|
jn : TJSONNumber;
|
|
jb : TJSONBool;
|
|
ja : TJSONArray;
|
|
jpe : TJSONObject.TEnumerator;
|
|
|
|
begin
|
|
//1. 解析 JSONStr
|
|
jo := TJSONObject.ParseJSONValue(JSONStr) as TJSONObject;
|
|
if jo = nil then Exit(JSONStr);
|
|
|
|
Result := '{' + #13#10;
|
|
try
|
|
jpe := jo.GetEnumerator;
|
|
if jpe = nil then Exit(JSONSTr);
|
|
|
|
while jpe.MoveNext do
|
|
begin
|
|
jp := jpe.Current;
|
|
if jp.JsonValue.TryGetValue(jo1) then
|
|
begin
|
|
Result := Result + LI(lv + 1) + '"' + jp.JsonString.Value + '":'#13#10;
|
|
Result := Result + LI(lv + 1) + JSON_Format(jo1.ToJSON,lv + 2);
|
|
Continue;
|
|
end
|
|
else
|
|
if jp.JsonValue.TryGetValue(jn) then //数字
|
|
Result := Result + LI(lv + 1) + '"' + jp.JsonString.Value + '": ' + jn.Value + ','#13#10
|
|
else
|
|
if jp.JsonValue.TryGetValue(jb) then //Boolean
|
|
Result := Result + LI(lv + 1) + '"' + jp.JsonString.Value + '": ' + jb.Value + ','#13#10
|
|
else
|
|
if jp.JsonValue.TryGetValue(ja) then //字符串
|
|
begin
|
|
Result := Result + LI(lv + 1) + '"' + jp.JsonString.Value + '": '#13#10;
|
|
Result := Result + LI(lv + 1) + JSON_Fromat_Array(ja,lv + 1);
|
|
end
|
|
else
|
|
if jp.JsonValue.TryGetValue(js) then //字符串
|
|
Result := Result + LI(lv + 1) + '"' + jp.JsonString.Value + '": "' + js.Value + '",'#13#10
|
|
end;
|
|
//去掉最后一行的 ,
|
|
S := Result.Substring(Length(Result) - 3,3);
|
|
if S = ','#13#10 then
|
|
Result := Result.Substring(0,Length(Result) - 3) + #13#10;
|
|
//最后结果的 }
|
|
if lv > 0 then
|
|
begin
|
|
lv := lv - 1;
|
|
Result := Result + LI(lv) + '},'#13#10;
|
|
end
|
|
else
|
|
Result := Result + LI(0) + '}'#13#10;
|
|
finally
|
|
if jo <> nil then
|
|
jo.Free;
|
|
if jpe <> nil then
|
|
jpe.Free;
|
|
end;
|
|
end;
|
|
|
|
|
|
//格式化数组, 缩进
|
|
function JSON_Fromat_Array(ja : TJSONArray; lv : word = 0) : string;
|
|
var
|
|
jae : TJSONArray.TEnumerator;
|
|
jv : TJSONValue;
|
|
js : TJSONString;
|
|
jn : TJSONNumber;
|
|
jb : TJSONBool;
|
|
jo : TJSONObject;
|
|
ja1 : TJSONArray;
|
|
S : string;
|
|
begin
|
|
//
|
|
Result := '['#13#10;
|
|
jae := ja.GetEnumerator;
|
|
if jae = nil then Exit('');
|
|
|
|
while jae.MoveNext do
|
|
begin
|
|
jv := jae.Current;
|
|
//进行数据处理
|
|
if jv.TryGetValue(jn) then //Number
|
|
Result := Result + LI(lv + 1) + jn.Value + ','#13#10
|
|
else
|
|
if jv.TryGetValue(jb) then //Boolean
|
|
Result := Result + LI(lv + 1) + jb.Value + ','#13#10
|
|
else
|
|
if jv.TryGetValue(jo) then //JSONObject
|
|
begin
|
|
Result := Result + LI(lv + 1) + JSON_Format(jo.ToString,lv + 2) ;
|
|
end
|
|
else
|
|
if jv.TryGetValue(ja1) then //JSONArray
|
|
Result := Result + LI(lv + 1) + JSON_Fromat_Array(ja1,lv + 1)
|
|
else
|
|
if jv.TryGetValue(js) then //string
|
|
Result := Result + LI(lv + 1) + '"' + js.Value + '",'#13#10;
|
|
end;
|
|
//去掉最后一行的 ,
|
|
S := Result.Substring(Length(Result) - 3,3);
|
|
if S = ','#13#10 then
|
|
Result := Result.Substring(0,Length(Result) - 3) + #13#10;
|
|
Result := Result + LI(lv) + '],'#13#10;
|
|
|
|
if jae <> nil then
|
|
jae.Free;
|
|
end;
|
|
|
|
|
|
//跨过的indent
|
|
function LI(lv : Word) : string;
|
|
begin
|
|
Result := StringOfChar(' ', lv * Level_indent);
|
|
end;
|
|
|
|
end.
|