Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: REST.Json.TJson.ObjectToJsonString formatiert ausgeben?

  Alt 7. Dez 2015, 11:00
Falls jemand wieder vor einen ähnlichen Problem steht:
Ich habe eine noch schönere Lösung (für das Endergebnis) gefunden.
In der JsonWorkbench-Demo aus Delphi 10 Seattle (z.B. C:\Users\Public\Documents\Embarcadero\Studio\17.0\ Samples\Object Pascal\RTL\Json) gibt es Beautifier-Funktion.

Verkürzt sieht das so aus:

Delphi-Quellcode:
unit Format.JSON;

interface

uses
  System.SysUtils,
  System.Classes,
  System.Json.Writers,
  System.Json.Readers,
  System.Json.Types;

type
  TJsonStringWriter = class(TJsonTextWriter)
  private
    FStringBuilder: TStringBuilder;
    FStringWriter: TStringWriter;
  public
    constructor Create;
    destructor Destroy; override;
    function ToString: string; override;
  end;

  TJsonStringReader = class(TJsonTextReader)
  private
    FStringReader: TStringReader;
  public
    constructor Create(const AJson: string);
    destructor Destroy; override;
  end;

  function FormatJsonString(const AJson: string): string;

implementation

function FormatJsonString(const AJson: string): string;
var
  JsonWriter: TJsonStringWriter;
  JsonReader: TJsonStringReader;
begin
  JsonReader := TJsonStringReader.Create(AJson);
  try
    JsonWriter := TJsonStringWriter.Create;
    try
      JsonWriter.Formatting := TJsonFormatting.Indented;
      JsonWriter.WriteToken(JsonReader);
      Result := JsonWriter.ToString;
    finally
      JsonWriter.Free;
    end;
  finally
    JsonReader.Free;
  end;
end;

{ TJsonStringWriter }

constructor TJsonStringWriter.Create;
begin
  FStringBuilder := TStringBuilder.Create;
  FStringWriter := TStringWriter.Create(FStringBuilder);
  inherited Create(FStringWriter);
end;

destructor TJsonStringWriter.Destroy;
begin
  FStringWriter.Free;
  FStringBuilder.Free;
  inherited Destroy;
end;

function TJsonStringWriter.ToString: string;
begin
  Result := FStringBuilder.ToString;
end;

{ TJsonStringReader }

constructor TJsonStringReader.Create(const AJson: string);
begin
  FStringReader := TStringReader.Create(AJson);
  inherited Create(FStringReader);
end;

destructor TJsonStringReader.Destroy;
begin
  FStringReader.Free;
  inherited;
end;

end.

Geändert von TiGü ( 7. Dez 2015 um 11:15 Uhr)
  Mit Zitat antworten Zitat