AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Erste Schritte mit Rest.Json.pas: Wann braucht man einen eigenen TJsonInterceptor?
Thema durchsuchen
Ansicht
Themen-Optionen

Erste Schritte mit Rest.Json.pas: Wann braucht man einen eigenen TJsonInterceptor?

Ein Thema von Der schöne Günther · begonnen am 2. Okt 2014 · letzter Beitrag vom 2. Okt 2014
 
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Erste Schritte mit Rest.Json.pas: Wann braucht man einen eigenen TJsonInterceptor?

  Alt 2. Okt 2014, 11:13
Delphi-Version: 5
Da bin ich wieder. Es werden noch viele Fragen zu diesem Thema kommen da leider selbst in XE7 noch alles vollkommen undokumentiert ist.

Es tut mir leid um den vielen Code, ich habe extra das vorgestern erschienene "Delphi cookbook" geholt. Es bietet ein Beispiel zu genau meiner Frage, aber leider ebenfalls undokumentiert. Deshalb kann ich es fast nicht verstehen.


Nehmen wir an, ich habe folgende zwei Typen:
Delphi-Quellcode:
TInnerType = class(TInterfacedObject, IInterface)
   public var
      [JSonName('someValue')]
      someValue: Single;
   public
      constructor Create(); // Setzt someValue auf 42.99
end;

TOuterType = class
   protected var
      [JSonName('someSimpleField')]
      someSimpleField: Integer;
      [JSonName('someAdvancedField')]
      someAdvancedField: IInterface;
   public
      constructor Create(); // Setzt someSimpleField auf 42 und
      // someAdvancedField auf eine neue TInnerType-Instanz
end;
Wandele ich eine TOuterType-Instanz in JSON um, ist die Ausgabe
Code:
{"someSimpleField":42}
. Das Feld "someAdvancedField" fehlt völlig.

Im Beispiel von Daniele Tetis Buch serialisiert er eine Klasse TPhoto nach JSON. Diese Klasse enthält einen TStream. Damit dieser TStream serialisiert wird hängt er ein Attribut [JSONReflect(ctString, rtString, TStreamInterceptor)] an das Feld. Den TStreamInterceptor hat er dann selber geschrieben.


Was ich dann tat: Ich fühlte mich schlau und fügte meinem Feld "someAdvancedField" ebenfalls folgendes Attribut hinzu:
Delphi-Quellcode:
TOuterType = class
   protected var
      [JSonName('someSimpleField')]
      someSimpleField: Integer;
      [JSonName('someAdvancedField')] [JSonReflect(ctObjects, rtObject, TJSONInterceptor )]
      someAdvancedField: IInterface;
   public
      constructor Create();
end;
Als Ergebnis gibt es:
Code:
{"someSimpleField":42,"someAdvancedField":[]}
Ich hatte das Gefühl schon fast da zu sein. Aber ein Blick auf die Implementation von Rest.JSonReflect.TJSONInterceptor bringt nur eine Klasse mit leeren Methoden zu Tage. Muss ich jetzt wirklich für jeden Firlefanz einen eigenen Interceptor schreiben? Oder gehe ich hier grade einen völlig falschen Weg?

Ich versuche meine Nerverei so klein wie möglich zu halten, aber mir fehlt irgendwie das Grundverständnis wie die Embarcadero-Serialisierung vonstatten gehen soll: Die letzten Embarcadero-Videos zu JSON behandeln nur trivialste Dinge wie das Anzeigen des JSON-Strings in Memos. Dokumentation scheint überhaupt keine vorhanden. Ich weiß noch nicht einmal, was der Unterschied zwischen dem Kram aus Rest.Json.pas und Data.DBXJSONReflect.pas ist. Das Posten des Beispiels aus dem Buch habe ich bewusst vermieden, Copyright und so.
  Mit Zitat antworten Zitat
 


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 08:39 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