AGB  ·  Datenschutz  ·  Impressum  







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

Delphi deserialize JSON und TDateTime

Ein Thema von Nebilim · begonnen am 31. Mär 2020 · letzter Beitrag vom 1. Apr 2020
Antwort Antwort
Nebilim

Registriert seit: 7. Jun 2019
Ort: Grafschaft B.
26 Beiträge
 
Delphi 10.3 Rio
 
#1

Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 08:38
Hi liebe leute,

ich bekomme ein JSON über Rest von meinem Application Server. Generiert wird er über Jackson soweit ich weiß und sieht zum beispiel so aus:

Code:
{   "fertigbis":"19:00:00",
    "anzahl":1,
    "nummer":4711,
    "aenderung":"27.02.2020 15:31:47"
}
jetzt habe ich in Delphi ein Classe mit "f"-Properties. Diese ermöglichen ja eine direkte zuordnung der WertePaare über TJson.JsonToObject<TMyClass>(JSONString).

Jetzt mein Problem. Bei der automatischen zuordnung scheint wohl etwas schief zu laufen beim Datum. Denn da bekomme ich immer diese FehlerMeldung:

---------------------------
xxxx.Exe
---------------------------
'27.0.0 0:0:0,0' ist keine gültige Datums- und Uhrzeitangabe.
---------------------------
OK
---------------------------


Meine Frage: kann ich da eingreifen in die auto Zuordnung oder was muss ich anders machen damit es geht?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 09:07
Da kann man allerdings was machen, wenn man ein passendes JsonReflectAttribute und einen TJSONInterceptor dafür schreibt.
Delphi-Quellcode:
interface

uses
  REST.JsonReflect;

type
  JsonMyDateAttribute = class(JsonReflectAttribute)
  public
    constructor Create;
  end;

implementation

uses
  System.Rtti, System.SysUtils;

type
  TMyDateTimeInterceptor = class(TJSONInterceptor)
  protected
    procedure StringReverter(Data: TObject; Field, Arg: string); override;
  end;

procedure TMyDateTimeInterceptor.StringReverter(Data: TObject; Field, Arg: string);
var
  ctx: TRTTIContext;
  datetime: TDateTime;
begin
  datetime := StrToDateTime(Arg);
  ctx.GetType(Data.ClassType).GetField(Field).SetValue(Data, datetime);
end;

constructor JsonMyDateAttribute.Create;
begin
  inherited Create(ctObject, rtString, TMyDateTimeInterceptor);
end;
Unter der Annahme, daß deine Klasse in etwa so aussieht, musst du das entsprechende Feld mit dem Attribut dekorieren.
Delphi-Quellcode:
type
  TMyObject = class
  private
    FFertigbis: string;
    FAnzahl: Integer;
    FNummer: Integer;
    [JsonMyDate]
    FAenderung: TDateTime;
  public
    constructor Create;
  end;
Eine ganz ähnliche Technik wird auch in diesem Artikel beschrieben: Serializing Objects with TJson
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Nebilim

Registriert seit: 7. Jun 2019
Ort: Grafschaft B.
26 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 09:35
Wow besten dank. Das ist ein ziemlich gutes Beispiel, dass man immer gut anwenden kann. Vielen dank.


ich bin mir sicher das es funktionieren wird, mein problem konnte ich allerdings so lösen das ich im Applicatin server das Datum formatiert habe
Code:
         DateFormat dateformatISO8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.GERMANY);
         mapper.setDateFormat(dateformatISO8601);
und dann beim Aufruf in Delphi ebenfalls die Option angegeben habe.

TJson.JsonToObject<TMyClass>(JSONString, [joDateFormatISO8601]); Danke danke dein Beispiel wird aber sicherlich nochmal gute Dienste erweisen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 10:01
OK, das ist natürlich der richtige Weg. Ich hatte mich eh schon gefragt, wer denn ein solches Datumsformat über JSON verschickt, aber wenn du das selbst unter Kontrolle hast, um so besser.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.596 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 10:58
Ich hatte mich eh schon gefragt, wer denn ein solches Datumsformat über JSON verschickt
Genau den Fall hatte ich auch gerade: Ein im Auftrag geschriebenes REST-Interface lieferte JSON mit Datumsangaben im deutschen Format. Ich wäre beinahe hintenüber gefallen, als sich das sah. Das gab erstmal virtuell ein paar auf die Finger für den, der das verbrochen hatte. Gerade für ein REST-Interface geht das gar nicht!

Aber da zeigt sich wieder, wie wenig Leute über Datumsformate nachdenken, wenn sie nicht schon davon gebissen wurden. Am schlimmsten sind dabei die Amis mit ihrem völlig hirnrissigen Format, das sie aber als ganz normal ansehen.

In einem anderen Auftrag gab es für Datums- und Zeitformat (und natürlich Dezimalpunkt vs. -komma) einen eigenen Abschnitt in der Spezifikation. Und das zu Recht!
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

AW: Delphi deserialize JSON und TDateTime

  Alt 31. Mär 2020, 11:08
Ohne Anpassung kann man diesen Wert ja erstmal als String nehmen, anstatt als TDateTime, und dann manuell umwandeln.

Was hier aber als bescheidenes Ergebnis bleibt, dass wohl niemand "absichtlich" Deutsch schreibt, sondern dass es vermutlich nur die "aktuelle" Systemformatierung nutzt, welche sich auch ändern kann. (z.B. eine andere Systemsprache)
Deswegen gibt es für JSON ja extra ein "festes" Format, welches verwendet werden sollte.



Dezimalzahlen mit Komma statt Punkt, geht "eigentlich" nur als String,
denn ansonsten ist gleich der komplette JSON-Text geschrottet, da er von keinen normalen JSON-Parser interpretierrt werden kann.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Nebilim

Registriert seit: 7. Jun 2019
Ort: Grafschaft B.
26 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Delphi deserialize JSON und TDateTime

  Alt 1. Apr 2020, 09:28
Wie würde man denn am richtigsten ein Datum verschicken und dann in Delphi entgegen nehmen? so wie ich das gemacht habe oder noch anders?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Delphi deserialize JSON und TDateTime

  Alt 1. Apr 2020, 09:40
TJson.JsonToObject erlaubt diverse Datumsformate über einen optionalen Parameter zu verwenden. Ich würde mich an dem Default-Wert [joDateIsUTC, joDateFormatISO8601] orientieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi deserialize JSON und TDateTime

  Alt 1. Apr 2020, 12:10
Per se ist in JSON ISO-8601 als UTC mit optionaler Zeitzone vorgegeben.
Hier hast Glück, dass diese Komponente auch andere Formate erlaubt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#10

AW: Delphi deserialize JSON und TDateTime

  Alt 1. Apr 2020, 12:18
In JSON ist überhaupt kein DateTime-Format vorgegeben. Es hat sich lediglich ISO8601 als Quasi-Standard etabliert, weil dieses Format am Besten geeignet ist und auch die Zeitzonen berücksichtigt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 06:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz