AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TJsonConverter für TDateTime

Ein Thema von lxo · begonnen am 13. Okt 2025 · letzter Beitrag vom 14. Okt 2025
Antwort Antwort
lxo

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

TJsonConverter für TDateTime

  Alt 13. Okt 2025, 16:51
Hallo,

folgendes Problem.
Ich möchte gerne das bei TDateTime wenn dort nichts angegeben ist kein 30.12.1899 geschrieben wird in den JSON-String sondern "null".
Dafür habe ich mir einen TJsonConverter gemacht.
Das WriteJson funktioniert auch.
Nur das ReadJson kriege ich nicht hin.
Im Grunde will ich das lesen gar nicht überschreiben.
Da "System.JSON.Readers.pas TJsonReader.ReadAsDateTimeInternal" schon null abfangen würde mit Default(TDateTime) genau wie ich es haben möchte.
Einfach ReadJson nicht überschreiben kann ich auch nicht dann hab ich einen Abstrakt Fehler.

Jemand eine Idee?




Delphi-Quellcode:
  TDateTimeConverter = class(TJsonConverter)
  public
    procedure WriteJson( const xWriter: TJsonWriter;
                         const xValue: TValue;
                         const xSerializer: TJsonSerializer); override;
    function ReadJson( const xReader: TJsonReader;
                       xTypeInf: PTypeInfo;
                       const xExistingValue: TValue;
                       const xSerializer: TJsonSerializer): TValue; override;
    function CanConvert( xTypeInf: PTypeInfo): Boolean; override;
  end;

...


function TDateTimeConverter.CanConvert(xTypeInf: PTypeInfo): Boolean;
begin
  Result := ( xTypeInf = TypeInfo( TDateTime));
end;

function TDateTimeConverter.ReadJson( const xReader: TJsonReader;
                                            xTypeInf: PTypeInfo;
                                      const xExistingValue: TValue;
                                      const xSerializer: TJsonSerializer): TValue;
begin
  if xReader.TokenType = TJsonToken.Null then
  begin
    Result := TValue.From< TDateTime>( Default( TDateTime));
  end
  else
  begin
    Result := TValue.From( xReader.Value);
    Result := TValue.From( xReader.ReadAsDateTime);
    Result := TValue.From( xExistingValue);
    // Hier soll einfach genau das passieren was auch in
    // System.JSON.Readers.pas TJsonReader.ReadAsDateTimeInternal passiert.
  end;
end;

procedure TDateTimeConverter.WriteJson(const xWriter: TJsonWriter; const xValue: TValue; const xSerializer: TJsonSerializer);
var
  lDateTime: TDateTime;
begin
  lDateTime := xValue.AsType<TDateTime>;
  if not lDateTime.SameDate( Default( TDateTime)) then
  begin
    xWriter.WriteValue( lDateTime);
  end
  else
  begin
    xWriter.WriteNull;
  end;
end;
  Mit Zitat antworten Zitat
EKON 29
lxo

Registriert seit: 30. Nov 2017
305 Beiträge
 
Delphi 12 Athens
 
#2

AW: TJsonConverter für TDateTime

  Alt 13. Okt 2025, 21:42
Ich möchte im Grunde nur das bei Default-Value im JSON-String "null" steht.
Das lesen passt ja schon der kann damit umgehen.
Nur beim Schreiben finde ich keine Möglichkeit.
Und mit dem eigenen Converter siehe ich keinen Weg wie ich beim lesen nicht gezwungen bin das lesen nochmal komplett zu schreiben wie es schon in "TJsonReader.ReadAsDateTimeInternal" gemacht wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: TJsonConverter für TDateTime

  Alt 14. Okt 2025, 08:45
Ich hatte da mal was zu geschrieben: Serializing Objects with TJson. Vielleicht hilft dir das ja bei dem Problem etwas weiter.
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 11: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