Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround? (https://www.delphipraxis.net/214476-delphi-12-system-json-floattojson-verschlimmbessert-workaround.html)

lxo 17. Jan 2024 07:40

Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Hallo,

mir ist aufgefallen das ich sporadisch eine Exception bekommen wenn ich Rest.JSON.pas TJson.ObjectToJsonString verwende.
Ursache, in Delphi 12 wurde die System.JSON.FloatToJson Funktion angepasst.

Angepasst wurde diese vermutlich aufgrund des Tickets: https://quality.embarcadero.com/browse/RSP-38387
Dabei wurde aber nicht beachtet das ein Float auch 1E-8, INF oder NAN sein kann.
Durch die Änderung wird am Ende einfach .0 hinzugefügt wenn kein . gefunden wird.
https://quality.embarcadero.com/browse/RSP-43463

Ist das bereits jemandem aufgefallen und hat jemand dafür evtl. ein passendes Workaround?

himitsu 17. Jan 2024 09:04

AW: Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Wenn das einfach angehängt wird, dann ist es natürlich ein Bug.

Jetzt müssen wir nur noch hoffen, dass sie deinen Kommentar unter dem geschlossenen Ticket noch sehen. Sonst wirst'e wohl ein Neues erstellen müssen.


Wobei ich aber nicht erkennen kann, dass JSON für Float Number zwingend einen
Delphi-Quellcode:
.
enthalten muß. (aber selbst wenn, dann gehört der Punkt vor das E)
Per se ist der Punkt optional, laut Definition.

Im Grunde kennt Delphi's JSON auch NAN, Infinity und -Infinity, aber .... hmmmmmmmmm.


PS: NINF

Zitat:

Delphi-Quellcode:
procedure TJsonTextWriter.WriteValue(Value: Single);
var
  Str: string;
begin
  inherited WriteValue(Value);

  if Value.IsPositiveInfinity then
    Str := JsonPositiveInfinity
  else if Value.IsNegativeInfinity then
    Str := JsonNegativeInfinity
  else if Value.IsNan then
    Str := JsonNaN
  else
    Str := FloatToStr(Value, FFormatSettings);

  if (FloatFormatHandling = TJsonFloatFormatHandling.Symbol) or not (Value.IsInfinity or Value.IsNan) then
    // nothing
  else
    if FloatFormatHandling = TJsonFloatFormatHandling.DefaultValue then
      Str := '0.0'
    else
      Str := QuoteChar + Str + QuoteChar;
  FWriter.Write(Str);
end;

Tipp für dich: TJsonFloatFormatHandling.Symbol



Aber ich sehe hier aber nirgendwo, dass sie blind ein '.0' anhängen.
Hast du ein Codebeispiel?

Der schöne Günther 17. Jan 2024 09:35

AW: Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Ich kann jetzt nichts zum Verhalten von Delphi 12 beitragen, aber wenn ich in dem Ticket sehe wie da irgendeiner reinpoltert, er findet, Delphi müsse etwas anders machen weil sein Python-Codeschnipsel damit nicht klar kommt - Und das reicht schon aus, damit Embarcadero an der Standardbibliothek etwas verschlimmbessert (und anscheinend bis heute keine ausreichende Testabdeckung für elementare Bestandteile der Standardbibliothek hat), dann weiß ich echt auch nicht mehr...

War nicht mal ein Argument für Delphi "Nimm deinen uralten Code, und der funktioniert heute noch?" Vielleicht kompiliert er, aber wenn die in jeder Version solche Dinge kaputt machen dann ist das auch nur noch Augenwischerei.

Wie kommt man eigentlich darauf? 30 Sekunden Internet-Recherche ergeben eigentlich eindeutig, dass der Dezimalpunkt da überhaupt nicht sein muss und das in Delphi bislang völlig ok gelöst war.
https://ecma-international.org/publi...ards/ecma-404/
Zitat:

JSON is agnostic about the semantics of numbers. (...) A number is a sequence of decimal digits with no superfluous leading zero. It may have a preceding minus sign (U+002D). It may have a fractional part prefixed by a decimal point (U+002E) (...)
https://www.json.org/json-en.html

https://datatracker.ietf.org/doc/html/rfc8259#section-6

Mann, echt...

himitsu 17. Jan 2024 09:39

AW: Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Als Spezial-Option zusätzlich/optional aktivierbar OK, aber so natürlich nicht.

lxo 17. Jan 2024 09:57

AW: Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Zitat:

Zitat von himitsu (Beitrag 1532091)
Aber ich sehe hier aber nirgendwo, dass sie blind ein '.0' anhängen.
Hast du ein Codebeispiel?

Siehe System.JSON.pas

- function FloatToJson
- function CurrencyToJson

TurboMagic 17. Jan 2024 17:09

AW: Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
 
Hallo,

ich hab' mal wo was abgesetzt was hoffentlich zu einer Reaktion von EMBT darauf führt ;-)

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 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