Как мне pretty-print JSON в Delphi?

Я ищу функцию, которая будет принимать строку 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;

4 ответов


используйте библиотеку superobject, убедитесь, что вы используете последняя версия из файла репозитория, а не 1.2.4 ZIP.

затем вы можете отформатировать объект TSuperObject с помощью .AsJSON(true) ("истина" делает трюк).

[ обратите внимание, что у вас нет контроля над порядком отображения полей JSON ]

[ и для создания объекта из строки:var lJSON : ISuperObject; lJSON := SO(string); ]


Если вы не хотите использовать какую-либо внешнюю библиотеку, и вы используете delphi XE5 или новее, есть очень удобный


вы также можете использовать следующие методы нашего открытого источника 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);
  ...

здесь new содержит:

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

если вы используете :

  new := JSONReformat(json,jsonUnquotedPropName);

вы получите следующий расширенный синтаксис (аналогичный тому, который используется в JavaScript или в MongoDB shell):

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

этот синтаксис принимается в качестве допустимого ввода для всех функций JSON нашего открытого исходного кода framework, как альтернатива синтаксису JSON по умолчанию. Мы нашли это довольно полезным, например, для файлов конфигурации.

обратите внимание, что наши JSONReformat() функция очень быстро. Он преобразует огромное 190 МБ unconformatable содержимого JSON из CityLots в 400 МБ украшенного JSON (предназначенного и с полями линии) за 1,4 секунды. SuperObject просто может прочитать его за 10 секунд и использует 1.1 GB только для хранения 190 МБ контента. И DBXJSON даже не возможность загрузки данных: он потребляет всю 32 - битную память-под Win64 (XE6), занимает 50 секунд и использует 3 ГБ ОЗУ для чтения 190 МБ JSON. См.эта статья для некоторых чисел.


Если вы работаете с Delphi XE или новее, вы можете использовать delphi-xe-json библиотека

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