AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TDate im Json

Ein Thema von Incocnito · begonnen am 13. Okt 2021 · letzter Beitrag vom 14. Okt 2021
Antwort Antwort
Seite 1 von 2  1 2   
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#1

TDate im Json

  Alt 13. Okt 2021, 16:16
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:

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;
Weiter bin ich mit Google nicht gekommen und ich verstehe auch nicht wirklich, was da passiert.
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.648 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TDate im Json

  Alt 13. Okt 2021, 17:58
Was steht denn bei StringReverter in Arg genau drin?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#3

AW: TDate im Json

  Alt 14. Okt 2021, 08:17
Im StringReverter in Arg steht "44298".
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.211 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TDate im Json

  Alt 14. Okt 2021, 09:22
Im StringReverter in Arg steht "44298".
Das sieht aber nicht wie ein Datum aus.
Vielleicht nochmal löschen und neu mit dem Converter Speichern.
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#5

AW: TDate im Json

  Alt 14. Okt 2021, 09:25
Ja, nur sind das leider echte Kundendaten. Die kann ich nicht löschen. -.-
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#6

AW: TDate im Json

  Alt 14. Okt 2021, 09:42
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 ...
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#7

AW: TDate im Json

  Alt 14. Okt 2021, 09:57
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!
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
3.211 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TDate im Json

  Alt 14. Okt 2021, 10:03
Ich hatte in der Json-Struktur nicht nur 1 Datumsfeld, sondern zwei.
Wie sehen die Daten da drin denn aus, kann es sein das dies in TDate und TTime getrennt gespeichert wurde ?
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#9

AW: TDate im Json

  Alt 14. Okt 2021, 10:25
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.

Geändert von Incocnito (14. Okt 2021 um 10:29 Uhr)
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#10

AW: TDate im Json

  Alt 14. Okt 2021, 10:40
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.
Angehängte Dateien
Dateityp: zip RttiTest.zip (1,9 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf