2013-08-29 2 views
4

Я ищу функцию, которая будет вводить строку JSON в качестве входных данных и форматировать ее с помощью разрывов строк и отступов (вкладок).Как я могу печатать JSON в Delphi?

Пример: У меня есть строки ввода:

{"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. Может ли кто-нибудь помочь с такой функцией?

Update - Решение с надобъекта:

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

Приятно, чтобы вы ответили. –

+1

Если вы просто изменили свой тип входных параметров на 'WideString', вам не понадобится * any * этого кода преобразования; компилятор будет автоматически выполнять эквивалентную задачу при каждом вызове 'FormatJson'. Просто измените тип, и вы можете заменить первые семь строк на 'Json: = TSuperObject.ParseString (PWideChar (InString), True)'. –

ответ

4

Использование библиотеки надобъекта, убедитесь, что вы используете the latest version from the repository file, not the 1.2.4 ZIP.

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

[Обратите внимание, что вы не имеете никакого контроля над тем, в котором отображаются поля JSON]

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

+0

Ваш совет работал для меня, спасибо! Просто возникла небольшая проблема с «TSuperObject.ParseString (mystring, true)»; где mystring coud не является строковым типом, но PWideString istead. –

+0

Ах, у вас есть версия Unicode Delphi –

1

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

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

Да, спасибо за этот совет! Я все еще использую Delphi 7, потому что мой проект слишком большой и слишком старый :) –

2

вы также можете использовать following methods нашего Open Source 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 
    ] 
    } 
} 

Если используется формат jsonUnquotedPropName:

new := JSONReformat(json,jsonUnquotedPropName); 

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

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

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

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

+0

Примечание. Наш блок 'SynCommons.pas' работает от Delphi 6 до XE6 на платформах Win32 и Win64 и полностью поддерживает Unicode, даже на Вы все еще используете версию Delphi 7. Фактически, единица (и эта функция 'JSONReformat()') выполняет весь процесс непосредственно в UTF-8, без выделения памяти в данные 'string' или' widestring'. Просто используйте предоставленные функции 'StringToUTF8()' или 'UTF8ToString()' для работы с вашими переменными 'string'. –

3

Если вы не хотите использовать внешнюю библиотеку и используете delphi XE5 или новее, в модуле REST.Json есть очень удобная функция TJson.Format().

uses json, REST.Json; 

{ ... }  

function FormatJSON(json: String): String; 
var 
    tmpJson: TJsonObject; 
begin 
    tmpJson := TJSONObject.ParseJSONValue(json); 
    Result := TJson.Format(tmpJson); 

    FreeAndNil(tmpJson); 
end; 
+0

Имейте в виду, что с Delphi Berlin Update 2 функция TJson.Format обеспечивает считываемый человеком, но не совместимый с Json выход, поскольку он не выполняет ничего, кроме двойных кавычек. – MarkF

Смежные вопросы