AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi JSON UInt64 convert error QP
Thema durchsuchen
Ansicht
Themen-Optionen

JSON UInt64 convert error QP

Ein Thema von KodeZwerg · begonnen am 4. Aug 2023 · letzter Beitrag vom 4. Aug 2023
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

JSON UInt64 convert error QP

  Alt 4. Aug 2023, 02:48
Hallo, ich wusste nicht wirklich in welche Sparte ich das Schreiben müßte deswegen ist es hier gelandet, bitte verschieben falls es hier fehl am Platz ist.
Es geht um Delphi Alexandria und deren JSON Library die nicht im Stande ist UInt64 korrekt zu verarbeiten.
Ich habe RSP-42079 erstellt, damit Ihr voten könnt.

Wer keinen Zugang dort hat, hier ist ein minimal Beispiel um es nachzuvollziehen oder mich im Besten Fall zu korrigieren!
Delphi-Quellcode:
program Project1;
 
uses
  System.JSON;
 
var
  JSonObject: TJSONObject;
begin
  JSonObject := TJSONObject.Create;
  try
    JSonObject.AddPair('Test', TJSONNumber.Create(High(UInt64)));
    WriteLn(JSonObject.GetValue('Test').AsType<UInt64>);
  finally
    JSonObject.Free;
  end;
  ReadLn;
end.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 09:39
Das liegt an der internen Exponentialdarstellung des UInt64 Maxvalue (1.84467440737096E19). Die _Val Funktionen der RTL brechen ab, da dort der Dezimalpunkt nicht als gültiges Zeichen erkannt wird.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all

Geändert von Union ( 4. Aug 2023 um 09:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 09:46
Als Workaround bietet sich die Umwandlung in einen String vor dem Aufruf des Constructors an:
Delphi-Quellcode:

    JSonObject.AddPair('Test', TJSONNumber.Create(High(UInt64).ToString)); // System.SysUtils in uses ergänzen
Ist der UINT im JSON bereits korrekt codiert, wird er beim Auslesen auch korrekt in eine UINT64 umgewandelt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 09:52
Nja, per se ist das Number im JSON als IEEE 754 double-precision binary floating-point format (binary64) definiert,
bzw. wird von vielen Bibliotheken so implementiert.

Somit hast'e bei Int64/UInt64 eh schnell probleme, da sie nicht in Double passen (19-20 Dezimalstellen, aber effektiv nur 15-16 stehen zur Verfügung)
Auch wenn einige Bibliotheken locker mal 128 Bytes aka Chars (inzwischen 8 KB) für eine Number im Parser zur Verfügung haben (eine Zahl mit tausenden Dezimalstellen)

Letztendlich kommt es natürlich auf die jeweilige Implementation drauf an.
https://www.ibm.com/docs/en/datapowe...-parser-limits
https://gist.github.com/JosePedroDia...0c49212bab644e
...


Tja, notfalls mußt du eben als String speichern und dann selber umwandeln.
Und ansonsten den "Bug" am Emba melden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Aug 2023 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 09:54
Leider ist das alles in System.pas und läßt sich nicht einfach korrigieren. Den pragmatischen Vorschlag von Uwe finde ich daher ganz ok.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Stolle58

Registriert seit: 4. Aug 2023
Ort: Frankfurt
20 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 10:28
Man könnte sich, aber auch selbst einen class helper schreiben:

Code:
type
  TJSONNumberHelper = class helper for TJSONNumber
  public
    constructor Create(const Value: UInt64); overload;
  end;


{ TJsonNumberHelper }

constructor TJSONNumberHelper .Create(const Value: UInt64);
begin
  inherited Create(Value.ToString);

end;
Reinhold
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 10:30
Tja, notfalls mußt du eben als String speichern und dann selber umwandeln.
TJSONNumber.Create(...) speichert ja den Wert bereits in einem String.

Bei einem UINT64-Parameter ist halt der nächst-passende overload die Double-Version. Das Problem entsteht also schon beim Aufruf von Create und muss also auch dort behoben werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Stolle58

Registriert seit: 4. Aug 2023
Ort: Frankfurt
20 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 10:38
JSONNumber besitzt mehrere Überladende Constructoren die den Value in einen string konvertiert.
Reinhold

Geändert von Stolle58 ( 4. Aug 2023 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: JSON UInt64 convert error QP

  Alt 4. Aug 2023, 12:18
Vielen Dank Reinhold und Uwe, beides funktioniert einwandfrei!
Für mich selbst nehme ich die Helper Variante um wie gewohnt ohne selbst zu casten das gewünschte Ergebnis zu erhalten.

Da es in meinen Augen ein Bug ist, jede Stimme zählt
Gruß vom KodeZwerg
  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 12:05 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