Einzelnen Beitrag anzeigen

lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#1

ObjectList serialisieren JSON

  Alt 10. Nov 2021, 08:56
Hallo zusammen,

ich hab mit Hilfe des Beitrags von Uwe Raabe probiert eine Objectlist zu de/serialisieren.
Serialisieren klappt aber deserialisieren klappt nicht.

Im TObjectListInterceptor<T>.ObjectsReverter knallt es immer mit einer Zugriffsverletzung.
Kann mir jemand sagen was ich da falsch mache?
List ist immer nil, ich hätte gedacht mit JSONOwned(False) umgeht man das.

https://www.uweraabe.de/Blog/2020/03...ts-with-tjson/


Delphi-Quellcode:

  TPerson = class
  private
   FName: String;
  public
   property Name: String read FName write FName;
  end;

  TPersonListe = TObjectList<TPerson>;

  TPersonListeInterceptor = TObjectListInterceptor<TPerson>;

  type
  TPersonJSON = class
   private
    [JSONOwned(False), JsonObjectList(TPersonListeInterceptor)]
    FPersonListe: TPersonListe;
   public
    constructor Create;
    destructor Destroy; override;
    property PersonListe : TPersonListe read FPersonListe write FPersonListe;
  end;

var
  Form78: TForm78;

implementation

{$R *.dfm}

procedure TForm78.Button1Click(Sender: TObject);
const
  cNamen: TArray<String> = [ 'Name1', 'Name2', 'Name3'];
var
  lPersonJSON : TPersonJSON;
  lPerson : TPerson;
  lReverseTest: TPersonJSON;
  lJSONString: String;
begin
  lPersonJSON := TPersonJSON.Create;
  try
    for var lName in cNamen do
    begin
      lPerson := TPerson.Create;
      lPerson.Name := lName;
      lPersonJSON.PersonListe.Add( lPerson);
    end;

    lJSONString := TJson.ObjectToJsonString( lPersonJSON);
  finally
    lPersonJSON.Free;
  end;

 // !! Hier krieg ich eine Zugriffsverletzung
  lReverseTest := TJson.JsonToObject<TPersonJSON>( lJSONString);
end;

{ TPersonJSON }

constructor TPersonJSON.Create;
begin
  inherited;
  FPersonListe := TPersonListe.Create( True);
end;

destructor TPersonJSON.Destroy;
begin
  FreeAndNil( FPersonListe);
  inherited;
end;

Geändert von lxo (10. Nov 2021 um 08:59 Uhr)
  Mit Zitat antworten Zitat