AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Objectlist Serialisieen und Deserialisieren mittels Rest.Json
Thema durchsuchen
Ansicht
Themen-Optionen

Objectlist Serialisieen und Deserialisieren mittels Rest.Json

Ein Thema von kompi · begonnen am 6. Aug 2025 · letzter Beitrag vom 6. Aug 2025
Antwort Antwort
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
62 Beiträge
 
Delphi 12 Athens
 
#1

Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 15:25
Hallo zusammen,

ich versuche, mittels Rest.Json Objekte zu serialisieren und deserialisieren. Diese Objekte stammen alle von einem Basisobjekt ab. Einige dieser Objekte habe Subobjekte, die eine Objectlist enthalten.

Delphi-Quellcode:
  TKeyValue = class
    private
      fname : string;
      fvalue : Tvalue;
      function getasstring : string;
      procedure setasstring(avalue : string);
      function getname : string;
      procedure setname(aname : string);
      function getasextended : Extended;
      procedure setasextended(avalue : Extended);
      function getasinteger : Integer;
      procedure setasinteger(avalue : Integer);
    public
      constructor Create; overload;
// constructor Create(Aname : string); overload;
      property Asstring : string read getasstring write setasstring;
      property AsExtended : Extended read getasextended write setasextended;
      property AsInteger : Integer read getasinteger write setasinteger;
      Property Name : string read getname write setname;
  end;

type
  JsonObjectListKeyValueAttribute = class(JsonObjectListAttribute<TKeyValue>)
  end;

type
  [JsonObjectlistKeyValue]
  TkeyValueElements = class(TObjectlist<TKeyValue>)
  end;

type
   TKeyValueListe = class
     private
      [JSONOwned(false),JsonObjectListKeyValue]
      FABWElements : TkeyValueElements;
      fname : string;
      [JSONOwned(false),JsonStrings]
      fstringlist : Tstringlist;
         function checkstring(AValue: string): Boolean;
      function searchinliste(aname : string) : TKeyValue;
      function getvalue(aindex : string) : TKeyValue;
      procedure setvalue(aindex : string; avalue : TKeyValue);
      function getvalueatindex(aindex : integer) : TKeyValue;
      function getname : string;
      procedure setname(aname : string);
      function gettostring(adelimiter : string) : string;
      function gettodelimstring : string;
      function gettostringcomplete(adelimiter : string) : string;
      function gettodelimstringcomplete : string;
      procedure settostringcomplete(adelimiter : string; avalue : string);
      procedure settodelimstringcomplete(avalue : string);
      function gettostringlist : tstrings;
      procedure settostringlist(astring : Tstrings);
    public
      constructor Create; overload;
      constructor Create(Aname : string); overload;
      destructor Destroy; override;
      procedure assign(Akeyvalueliste : Tkeyvalueliste);
      procedure add(aname, avalue: string); overload;
      procedure add(aname: string; avalue: integer); overload;
      procedure add(aname: string; avalue: extended); overload;
      procedure Reset;
      function Count : integer;
      property TostringList : Tstrings read gettostringlist write settostringlist;
      property Value[aindex : string] : TKeyValue read getvalue write setvalue;default;
      property Valueatindex[aindex : integer] : TKeyValue read getvalueatindex;
      Property Name : string read getname write setname;
{$WARNINGS off}
      Property Tostring[adelimiter : string] : string read gettostring;
{$Warnings on}
      Property Todelimstring : string read gettodelimstring;
      Property Tostringcomplete[adelimiter : string] : string read gettostringcomplete write settostringcomplete;
      Property Todelimstringcomplete : string read gettodelimstringcomplete write settodelimstringcomplete;
  end;
Ich bin genauso vorgegangen, wie Uwe Raabe dies mal hier gepostet hat. Ich verwenden sich seine Unit Rest.Json.Helpers von github ohne Änderungen.
Es geht um das Feld Fabwelements. Dies ist eine Objectlist von Tkeyvalue. Immer, wenn Elemente in dieser Objectlist vorhanden sind, erhalte ich beim Verlassen des TypeObjectsConverter die Meldung "tkpointer wird nicht unterstützt". Das Subobjekt ist im übrigen oben angezeigt.
Mache ich hier noch etwas falsch?
Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#2

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 15:44
Ich kann das jetzt damit nicht nachstellen, weil halt noch so einiges fehlt, aber hast du die Unit REST.Json.Types in der uses-Anweisung? Andernfalls solltest du beim Compilieren eine Warnung W1074 Unbekanntes benutzerdefiniertes Attribut erhalten und dann funktioniert das JSONOwned nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
349 Beiträge
 
Delphi 12 Athens
 
#3

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 15:48
Du nutzt eine "normale" `Objectlist`. Uwe hat in der Github beschreibung eine `JsonObjectList`, liegt darin vielleicht schon das Problem?
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
62 Beiträge
 
Delphi 12 Athens
 
#4

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 15:56
Ich habe die Unit Rest.Json.types eingebunden. Die Warnung benutzerdefiniertes Attribute erscheint auch nicht. Es lässt sich alles kompilieren, nur es kommt beim Ausführen die Exception Tkpointer wird nicht unterstützt.
Dies kommt immer, wenn in der Objectlist ein Objekt vom Typ Tkeyvalue enthalten ist und der Converter verlassen wird.

Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#5

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 16:22
Nee, das passt schon. JsonObjectList ist das Attribut was man ableiten muss und das hat er ja auch getan. Der Code entspricht strukturell schon dem aus dem Readme. Das hatte allerdings auch noch einen Fehler (die Klasse heißt JsonObjectListAttribute), aber den hat sicher der Compiler gemeldet, denn der Code ist soweit korrekt.

Wenn es also nicht an der fehlenden Unit liegt, dann hätte ich gerne einen reproduzierbaren Testfall in Form eines minimalen Projekts.

Übrigens ist das JsonObjectListKeyValue bei den Feld-Attributen redundant, da es ja schon bei der Klasse TkeyValueElements angegeben ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#6

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 16:36
Ich sehe schon woran es liegt: Ein TValue Feld lässt sich nicht in JSON umwandeln. Das hat erstmal nichts mit den Listen zu tun, sonder damit dass TValue ein record ist und neben einem Pointer, einem Interface auch noch einen varianten Record-Teil hat.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
kompi

Registriert seit: 27. Apr 2012
Ort: Duisburg
62 Beiträge
 
Delphi 12 Athens
 
#7

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 17:12
Hallo zusammen,

ich kann bestätigen, dass es an der Tvalue-Variablen fvalue lag. Ich habe dieses Feld in einen String verwandelt, und nun funktioniert es, wie es soll.
Da wäre ich selbst nicht drauf gekommen.

Noch mal Danke an alle.

Gruß Kompi
Detlef Schmitz
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.771 Beiträge
 
Delphi 12 Athens
 
#8

AW: Objectlist Serialisieen und Deserialisieren mittels Rest.Json

  Alt 6. Aug 2025, 19:30
Wenn ich demnächst etwas Zeit finde, werde ich mal schauen, ob man das mit einem passenden Converter lösen kann.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz