AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Delphi 12 - System.JSON.FloatToJson - verschlimmbessert - Workaround?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von lxo · begonnen am 17. Jan 2024 · letzter Beitrag vom 17. Jan 2024
Antwort Antwort
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 17. Jan 2024, 08:40
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 17. Jan 2024, 10:04
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 . 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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Jan 2024 um 10:07 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 17. Jan 2024, 10:35
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 17. Jan 2024, 10:39
Als Spezial-Option zusätzlich/optional aktivierbar OK, aber so natürlich nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
lxo

Registriert seit: 30. Nov 2017
288 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 17. Jan 2024, 10:57
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
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 17. Jan 2024, 18:09
Hallo,

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

Grüße
TurboMagic
  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: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