![]() |
TDate im Json
Hi Zusammen,
ich habe eine Klasse, die ein TDate enthällt, was durch TJSON.ObjectToJsonString(obj) irgendwann mal als '{"Wert":44298}' konvertiert wurde. Jetzt bekomme ich bei "TJSON.JsonToObject<>()" aber die Fehlermeldung, dass "44298" ein ungültiger Datums-String ist. Ich hatte mich schon an einem Json-Attribute versucht, aber ich verstehe überhaubt nicht, was da passiert. Offensichtlich hilft das hier nicht weiter:
Delphi-Quellcode:
Weiter bin ich mit Google nicht gekommen und ich verstehe auch nicht wirklich, was da passiert.type JsonMyDateAttribute = class(JsonReflectAttribute) public constructor Create(); end; type TMyDateInterceptor = class(TJSONInterceptor) public function StringConverter(Data : TObject; Field : String) : String; override; procedure StringReverter(Data : TObject; Field : String; Arg : String); override; end; ... { JsonMyDateAttribute } constructor JsonMyDateAttribute.Create(); begin inherited Create(ctObject, rtString, TMyDateInterceptor); end; { TMyDateInterceptor } function TMyDateInterceptor.StringConverter(Data : TObject; Field : String) : String; var ctx : TRTTIContext; sValue : String; begin sValue := ctx.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsType<String>; Result := DateToISO8601(StrToFloatDef(sValue, 0)); end; procedure TMyDateInterceptor.StringReverter(Data : TObject; Field : String; Arg : String); var ctx : TRTTIContext; dtVal : TDate; begin dtVal := StrToFloatDef(Arg, 0); ctx.GetType(Data.ClassType).GetField(Field).SetValue(Data, dtVal); end; Er läuft da beim Aufruf von JsonToObject zwar rein und in dtVal steht dann auch ein brauchbares Datum, aber letztlich kommt der gleiche Fehler. Nebenbei wüsste ich als auch gerne, was denn die korrekte Speicherart von TDate sein soll. An anderer Stelle (einem FMX-Programm) kann ich ein Array of TDate aber problemlos auslesen, wenn die Werte als Integer im Json-String "gespeichert" sind. Liebe Grüße Incocnito |
AW: TDate im Json
Was steht denn bei StringReverter in Arg genau drin?
|
AW: TDate im Json
Im StringReverter in Arg steht "44298".
|
AW: TDate im Json
Zitat:
Vielleicht nochmal löschen und neu mit dem Converter Speichern. |
AW: TDate im Json
Ja, nur sind das leider echte Kundendaten. Die kann ich nicht löschen. -.-
|
AW: TDate im Json
Alles zurück, ich behaupte das Gegenteil!
Ich bin so blind! Ich hatte in der Json-Struktur nicht nur 1 Datumsfeld, sondern zwei. Da aber in beiden die gleiche Zahl stand, hatte ich gedacht, er beschwert sich über Datumsfeld1 und nicht weiter geschaut. Jetzt habe ich dem zweiten Datumsfeld auch das JsonAttribute gesetzt, nun geht es ... als nächstes noch schauen, dass er auch neu erstellte Json einlesen kann ... |
AW: TDate im Json
Jetzt steht beim Speichern "null" für den Wert.
Was ist dann jetzt wieder passiert? Ich hätte schwören können vor 5 Minuten tat das noch! |
AW: TDate im Json
Zitat:
|
AW: TDate im Json
Nein, es gibt kein TTime. Dann hätte ich ein TDateTime genommen und nicht 2 Felder.
Aber spielt das denn eine Rolle? Beim Auslesen läuft er in StringReverter und beim Speichern in ObjectConverter, das verwirrt mich auch gerade. Ich musste für das Feld [JsonMyDate] [JSONReflect(ctString, rtString, TMyDateInterceptor)] angeben. Ah! Jetzt seh' ich's ... im Attrbute.Create steht ja auch "ctObject, rtString" ... Wenn man nur kopiert, ohne zu verstehen, was da passiert! -.- Frage: Werden Dates wirklich "2021-10-14T00:00:00.000Z" gespeichert? Das sieht so falsch aus mit dem Zeitanteil. |
AW: TDate im Json
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hänge mal mein aktuelles Test-Projekt an ...
dann kann das jeder nach belieben nachvollziehen. Ist vielleicht auch ein gutes Projekt um in diese RTTI-Geschichte rein zu kommen. |
AW: TDate im Json
Wenn in dem String kein Datum sondern die Zahl 44298 steht, dann sollte es nicht
Delphi-Quellcode:
heißen, sondern
dtVal := StrToFloatDef(Arg, 0)
Delphi-Quellcode:
.
dtVal := StrToIntDef(Arg, 0)
Edit: Aber das erklärt leider noch nicht den Fehler. |
AW: TDate im Json
Zitat:
![]() So sollte es aussehen Zitat:
wenn die Zahl wirklich Integer ist, dann wird das der "ganzzahlige" Date-Anteil sein. Die Nachkommastellen der Zeitanteils sind dabei unter den Tisch gefallen ( deshalb T00:00:00.000Z ); Entweder findest Du den Zeitanteil im 2ten DateTime Speicher, oder der wurde nie als Double abgespeichert und ist damit verloren. |
AW: TDate im Json
Ah, jetzt weiß ich glaube ich wieso ihr auf den Zeitanteil kommt...
Die Struktur in der Datenbank war vom Prinzip:
Code:
Da musste ich nicht nur "Wert1" als [JsonMyDate] definieren, sondern auch "Wert5".
{
"Wert1":12345, "Wert2":"BlaBlub", "Wert3":{ "Wert4":12.45, "Wert5":12345 "Wert6":"BlubTest" } } Dabei ist auch tatsächlich nur der Datumswert interessant, den Zeitanteil braucht man in dem Fall überhaubt nicht. Dass ich statt "ToInt" "ToFloat" genommen habe, war eher so ein Reflex um bei zukünfitgen Änderungen nicht gleich irgendwas kaputt zu machen. "ToFloat" kann halt mehr verarbeiten als "ToInt", mehr steckte da gar nicht hinter, reine Vorsichtsmaßnahme. Ich fange öfters mal Fehler ab, die gar nicht sein können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 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