Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi JSON/Superobject mit Binären Daten (https://www.delphipraxis.net/189728-json-superobject-mit-binaeren-daten.html)

Shark99 13. Jul 2016 14:40

JSON/Superobject mit Binären Daten
 
Ich bin dabei das JSON Format mittels superobject zu speichern und bin mir beim Escapen unsicher.

Ich nehme einen String sAESData der per AES Verschlüsselt wird.

Diesen sAESData der Binäre Daten erhält wandle ich so in JSON um:
Delphi-Quellcode:
var soString: ISuperObject;
    sAESData: string;
    sOutput: string;

...

  soString := TSuperObject.Create(sAESData);
  sOutput := soString.AsJSon;
  soString := nil;
In den Tests klappt bisher alles. Auch wenn sAESData 0-Bytes enthält gibt es keine Exception und sOutput schaut OK aus.

Ich wollte trotzdem Fragen ob hier keine Falle lauert! Kann ich soString.AsJSon für beliebige binäre Daten verwenden?

Neutral General 13. Jul 2016 14:58

AW: JSON/Superobject mit Binären Daten
 
Um auf Nummer sicher zu gehen würde ich die binären Daten als Base64-String speichern.

Shark99 13. Jul 2016 16:29

AW: JSON/Superobject mit Binären Daten
 
Das macht die Datei eine Ecke größer. Würde es nur machen wenn es wirklich notwendig ist.

Zacherl 13. Jul 2016 16:46

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von Shark99 (Beitrag 1342599)
Das macht die Datei eine Ecke größer. Würde es nur machen wenn es wirklich notwendig ist.

Sobald dein AES String zufällig das Äquivalent zu einem der JSON Trennzeichen beinhaltet, wird die Datei ungültig werden. Base64 ist definitiv erforderlich.

Shark99 13. Jul 2016 17:02

AW: JSON/Superobject mit Binären Daten
 
Welches spezifisches JSON Trennzeichen meinst du?

Neutral General 13. Jul 2016 17:20

AW: JSON/Superobject mit Binären Daten
 
Geschweifte Klammern, Kommas, etc. Alles was bei JSON zur Syntax dazugehört

Shark99 13. Jul 2016 17:34

AW: JSON/Superobject mit Binären Daten
 
Hmm verstehe ist nicht.

Wenn ich den Text "abc{," habe wird daraus

{"string": "abc{,"}

Und ein JSON Validator hat kein Problem damit.

Sir Rufo 13. Jul 2016 17:36

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von Zacherl (Beitrag 1342601)
Zitat:

Zitat von Shark99 (Beitrag 1342599)
Das macht die Datei eine Ecke größer. Würde es nur machen wenn es wirklich notwendig ist.

Sobald dein AES String zufällig das Äquivalent zu einem der JSON Trennzeichen beinhaltet, wird die Datei ungültig werden. Base64 ist definitiv erforderlich.

Nö, die werden von SuperObject entsprechend escaped, ist also insofern kein Problem.
Zitat:

Zitat von Shark99 (Beitrag 1342605)
Hmm verstehe ist nicht.

Wenn ich den Text "abc{," habe wird daraus

{"string": "abc{,"}

Und ein JSON Validator hat kein Problem damit.

Eben weil SuperObject darauf achtet (achten sollte)

himitsu 14. Jul 2016 10:33

AW: JSON/Superobject mit Binären Daten
 
"binäre" Daten in einem "String" ... wo es hier Probleme geben kann/wird, ist bei der Codierung, z.B. Umwandlung von Unicode (der Typ String seit D2009) z.B. nach ANSI, jenachdem wie das JSON am Ende gespeichert wird.
Außer SuperObjekt sorgt immer dafür, dass das JSON nur noch ASCII-Zeichen enthält.

Sir Rufo 14. Jul 2016 10:44

AW: JSON/Superobject mit Binären Daten
 
Bei JSON gibt es wenig Spielraum wie da was gespeichert wird

http://json.org

Shark99 14. Jul 2016 11:01

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von himitsu (Beitrag 1342644)
"binäre" Daten in einem "String" ... wo es hier Probleme geben kann/wird, ist bei der Codierung, z.B. Umwandlung von Unicode (der Typ String seit D2009) z.B. nach ANSI, jenachdem wie das JSON am Ende gespeichert wird.
Außer SuperObjekt sorgt immer dafür, dass das JSON nur noch ASCII-Zeichen enthält.

Was sollte sonst verwendet werden wenn in den Daten sowohl Unicode Strings, als auch Binäres vorkommen kann (da optionale AES Verschlüsselung). Bytechar?

himitsu 14. Jul 2016 11:22

AW: JSON/Superobject mit Binären Daten
 
"wenig" und nicht jede Libt hält sich richtig an alles.
OK, SuperObjekt sollte sich an die Syntax halten, aber wie von SuperObjekt die Strings kodiert werden, weiß ich nicht ganz sicher.

Würde aber alles "Nicht-ASCII" immer mit \u... kodiert, dann gibt es nie Probleme.

Sir Rufo 14. Jul 2016 12:01

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von himitsu (Beitrag 1342658)
"wenig" und nicht jede Libt hält sich richtig an alles.
OK, SuperObjekt sollte sich an die Syntax halten, aber wie von SuperObjekt die Strings kodiert werden, weiß ich nicht ganz sicher.

Würde aber alles "Nicht-ASCII" immer mit \u... kodiert, dann gibt es nie Probleme.

Das ist eher kontraproduktiv, denn der String \u... wird im JSON als \\u... dargestellt. Das bringt irgendwie nichts

himitsu 14. Jul 2016 13:48

AW: JSON/Superobject mit Binären Daten
 
Ich meinte doch das JSON-\u , so wie das #123 im Delphi ... das sollte der nicht nochmal maskieren (hoff ich doch, dass der das nicht macht).

p80286 14. Jul 2016 14:10

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von Sir Rufo (Beitrag 1342662)
Zitat:

Zitat von himitsu (Beitrag 1342658)
"wenig" und nicht jede Libt hält sich richtig an alles.
OK, SuperObjekt sollte sich an die Syntax halten, aber wie von SuperObjekt die Strings kodiert werden, weiß ich nicht ganz sicher.

Würde aber alles "Nicht-ASCII" immer mit \u... kodiert, dann gibt es nie Probleme.

Das ist eher kontraproduktiv, denn der String \u... wird im JSON als \\u... dargestellt. Das bringt irgendwie nichts

Jetzt bist du aber sehr kleinlich, wenn deine Json-Software sich um das escapen kümmern kann, dann wirf ihr doch einfach x000D in den Rachen. Wenn sie damit nicht korrekt umgehen kann, solltest Du einen Weg finden wie \u000D in die Json-Datei kommt. Keine Gedanken muß man sich machen, wenn man Base64 oder auch Base16 codiert.
InAußerdem ist die Rede von "Unicode Characters" je nach Sichtweise würde dies z.B. den Bereich von x0000-001F ausschließen, da es sich hierbei um Steuercodes handelt, was meiner Meinung nach wiederum für Basexx spricht.

Gruß
K-H

Sir Rufo 14. Jul 2016 15:01

AW: JSON/Superobject mit Binären Daten
 
Ich glaube fast wir reden aneinander vorbei.

Liegt aber wohl daran, dass ich so ein JSON-String niemals direkt erstelle sondern eben erstellen lasse. SuperObject oder das in Delphi eingebaute Gedöns kümmert sich dann darum, dass der von mir beliebig gewählte string JSON-konform in so einem JSON-Objekt abgelegt wird.

Nur so als Beispiel:
Delphi-Quellcode:
var
  lFoo             : TFoo;
  lFooStr          : string;
  lExpected, lActual: string;
begin
  lExpected := #0 + #1 + #2 + #3 + #4 + #5;

  lFoo := TFoo.Create;
  try
    lFoo.Bar := lExpected;
    lFooStr := lFoo.ToJson( ).AsJSon( );
  finally
    lFoo.Free;
  end;

  lFoo := TFoo.FromJson( lFooStr );
  try
    lActual := lFoo.Bar;
  finally
    lFoo.Free;
  end;

  Assert( lExpected.Equals( lActual ) );
end;
als JSON-Objekt:
Code:
{"bar":"\u0000\u0001\u0002\u0003\u0004\u0005"}
BTW: Der Delphi-Interne JSON-Serialisierer bekommt das zurückwandeln nicht auf den Schirm, da bleibt
Delphi-Quellcode:
TFoo.Bar
einfach leer

p80286 14. Jul 2016 15:21

AW: JSON/Superobject mit Binären Daten
 
Zitat:

Zitat von Sir Rufo (Beitrag 1342682)
SuperObject oder das in Delphi eingebaute Gedöns kümmert sich dann darum, dass der von mir beliebig gewählte string JSON-konform in so einem JSON-Objekt abgelegt wird.

Jo, wenn denn die Daten die Du hast, ein String sind. Enthält diese Aneinanderreihung von Werten, Werte die nicht Codierungskonform sind, wird es spannend. Und diese Spannung kannst Du umgehen, indem Du deine Werte nimmst und ihnen eine BaseXX-Codierung zukommen läßt.
Eine weitere Möglichkeit, wäre es, ein Array zu nutzen, dem sollte es ziemlich egal sein welche Daten es bekommt.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 Uhr.

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