Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?) (https://www.delphipraxis.net/215579-tjsonvalue-format-fuegt-escapezeichen-ein-neu-delphi-12-a.html)

bernau 31. Jul 2024 08:16

TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?)
 
Folgender (Test-)Quellcode:

Delphi-Quellcode:
procedure TFormBeautifyTest.BitBtn1Click(Sender: TObject);
var
  lJSONValue: TJSONValue;
  lJsonString: String;
  lJsonPair: TJsonPair;
begin
  lJsonString := '{"object": "value","test/html": "http://url"}';
  lJSONValue := TJSONObject.ParseJSONValue(lJsonString, true, true);
  try
    MemoDest.Lines.Text := lJSONValue.Format(2);
    //MemoDest.Lines.Text := lJSONValue.tostring; // <- hier gibt es auch den Fehler. Nur unformatiert.
   
    // Mal den Inhalt der JSON-Objekte testen. Hier ist der Wert korrekt.
    lJsonPair := TJSONObject(lJSONValue).Pairs[1];
    MemoDest.Lines.add('');
    MemoDest.Lines.add(lJsonPair.JsonString.Value);
    MemoDest.Lines.add(lJsonPair.JsonValue.Value);
  finally
    lJSONValue.Free;
  end;
end;
Eigentlich erwarte ich folgenden output:

Code:
{
  "object": "value",
  "test/html": "http://url"
}

test/html
http://url
Tatsächlich werden die Slashes mit einem Backslash escaped. Ist aber in einem JSON-Text nicht vorgesehen/notwendig.

Code:
{
  "object": "value",
  "test\/html": "http:\/\/url"
}

test/html
http://url
Bin mir nicht sicher, aber mich meine es war in Delphi 11 nicht so.

Oder habe ich irgendetwas übersehen? Gibt es ein Property, welches die Escape-Zeichen unterdrückt?

himitsu 31. Jul 2024 09:01

AW: TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?)
 
Laut Definition ist es aber vorgesehn und vollkommen korrekt, wenn es so gemacht wird,
auch wenn Viele (inkl. mir) es nicht für notwendig erachten mögen.

Inzwischen wurde JSON auch in einige Standards aufgenommen.
RFC 8259 und ECMA-404

Wenn man sie streng ganz genau nimmt, dann steht dort, dass dieses Zeichen escaped werden "muß",
aber es ist auch erlaubt, dass es beim Dekodieren auch unescaped sein darf. :stupid:



Hast du mal in die Optionen geschaut, ob es dagegen was gibt?
[add] TJSONOutputOptions sagt nö

bernau 31. Jul 2024 09:15

AW: TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?)
 
Zitat:

Zitat von himitsu (Beitrag 1539392)
Laut Definition ist es aber vorgesehn und vollkommen korrekt, wenn es so gemacht wird,
auch wenn Viele (inkl. mir) es nicht für notwendig erachten mögen.

Oha. Stimmt. Du hast recht.

https://www.json.org/json-de.html

Lesbarer ist es aber dennoch ohne Escapezeichen. Vielleicht gibt es irgendwann mal ein Property in TJSONValue, bei dem man Escape beim Forewardslash abschalten kann.

Edit:

Witzigerweise werden im rfc8259 die examples ohne den Escapezeichen angegeben ;-) :

https://datatracker.ietf.org/doc/htm...259#section-13

EditEdit:

Allerdings steht im RFC auch folgendes

Zitat:

All Unicode characters may be placed within the
quotation marks, except for the characters that MUST be escaped:
quotation mark, reverse solidus, and the control characters (U+0000
through U+001F).

bernau 31. Jul 2024 09:54

AW: TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?)
 
Ich habe da mal ein neues Feature angefragt.

https://embt.atlassian.net/servicede...tal/1/RSS-1475

Schade, dass man nicht mehr abstimmen kann :-(

himitsu 31. Jul 2024 10:29

AW: TJSONValue.Format fügt Escapezeichen ein. (Neu in Delphi 12?)
 
Unübersichtlich, die Suche ist ein Grauß und vieles fehlt. :thumb:

Zitat:

Zitat von himitsu (Beitrag 1539392)
Inzwischen wurde JSON auch in einige Standards aufgenommen.
RFC 8259 und ECMA-404

Wenn man sie streng ganz genau nimmt, dann steht dort, dass dieses Zeichen escaped werden "muß",
aber es ist auch erlaubt, dass es beim Dekodieren auch unescaped sein darf. :stupid:

Jupp, auch bei ECMA ist es in den Beispielen und auch im Abschnitt "9 Strings" so angegeben.
https://ecma-international.org/publi...ards/ecma-404/


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz