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
 
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
 


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 19:23 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