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;