11

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

5 に答える 5

15

外部ライブラリを使用したくない場合、および 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;
于 2016-06-28T08:50:05.947 に答える
7

また、オープン ソースユニットの次の方法を使用することもできます。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シェルで使用される構文に似ています)。

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

この構文は、デフォルトの JSON 構文の代わりに、オープン ソース フレームワークのすべての JSON 関数の有効な入力として受け入れられます。たとえば、構成ファイルなど、非常に便利であることがわかりました。

JSONReformat()この関数は非常に高速であることに注意してください。これは、 CityLotsからの 190 MB の巨大な適合不可能な JSON コンテンツを、1.4 秒で 400 MB の美化された JSON (意図的で行フィールドを含む) に変換します。SuperObjectは 10 秒でそれを読み取ることができ、190 MB のコンテンツを格納するためだけに 1.1 GB を使用します。また、DBXJSON はデータをロードすることさえできません。32 ビット メモリをすべて消費します。Win64 (XE6) では、190 MB の JSON を読み取るのに 50 秒かかり、3 GB の RAM を使用します。数値については、この記事を参照してください。

于 2014-08-22T20:29:38.553 に答える
6

スーパーオブジェクト ライブラリを使用してください。1.2.4 ZIP ではなく、リポジトリ ファイルの最新バージョンを使用していることを確認してください。

次に、TSuperObject オブジェクトを次のようにフォーマットできます.AsJSON(true)('true' でうまくいきます)。

[JSON フィールドが表示される順序を制御できないことに注意してください]

[そして、文字列からオブジェクトを作成するには: var lJSON : ISuperObject; lJSON := SO(string);]

于 2013-08-29T12:48:13.233 に答える
1

Delphi XE 以降を使用している場合は、delphi-xe-jsonライブラリを使用できます。

function PrettyPrint (aJSON : string) : string;
var
  jo : IJSONObject
begin
  jo := TJSON.NewObject(aJSON);
  result := jo.ToString(true);
end;
于 2013-08-29T13:56:50.070 に答える