在Delphi XE2中,我需要制作一个接收JSONValue并返回缩进的String的函数,就像JSONLint一样。这个JSONValue可以是任何类型的JSON,可以是数组,对象甚至是字符串,因此我必须确保使用此函数覆盖所有类型。我不知道从哪里开始。

最佳答案

您将必须递归执行此操作。像这样:

const INDENT_SIZE = 2;

procedure PrettyPrintJSON(value: TJSONValue; output: TStrings; indent: integer = 0); forward;

procedure PrettyPrintPair(value: TJSONPair; output: TStrings; last: boolean; indent: integer);
const TEMPLATE = '%s : %s';
var
  line: string;
  newList: TStringList;
begin
  newList := TStringList.Create;
  try
    PrettyPrintJSON(value.JsonValue, newList, indent);
    line := format(TEMPLATE, [value.JsonString.ToString, Trim(newList.Text)]);
  finally
    newList.Free;
  end;

  line := StringOfChar(' ', indent * INDENT_SIZE) + line;
  if not last then
    line := line + ','
  output.add(line);
end;

procedure PrettyPrintJSON(value: TJSONValue; output: TStrings; indent: integer);
var
  i: integer;
begin
  if value is TJSONObject then
  begin
    output.add(StringOfChar(' ', indent * INDENT_SIZE) + '{');
    for i := 0 to TJSONObject(value).size - 1 do
      PrettyPrintPair(TJSONObject(value).Get(i), output, i = TJSONObject(value).size - 1, indent + 1);
    output.add(StringOfChar(' ', indent * INDENT_SIZE) + '}');
  end
  else if value is TJSONArray then
    //left as an exercise to the reader
  else output.add(StringOfChar(' ', indent * INDENT_SIZE) + value.ToString);
end;


这涵盖了基本原理。警告:我把这个写在头顶上。它可能不正确甚至无法编译,但这是一般的想法。此外,您还必须提出自己的打印JSON数组的实现。但这应该可以帮助您入门。

关于json - JSONValue缩进字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11797583/

10-09 16:56