Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Dataset austausch über JSON (https://www.delphipraxis.net/209044-dataset-austausch-ueber-json.html)

fisipjm 18. Okt 2021 12:19

Datenbank: MSSQL/Memtable • Version: xyz • Zugriff über: Firedac

Dataset austausch über JSON
 
Hi,

Ich habe das, hoffe ich mal, folgende verständnissproblem:

Eine Query (Ableitung von Dataset) hat die Funktion SaveAsStream mit Formatübergabe (in meinem Fall sfJSON).
Eine FDMemtable (Ableitung von Dataset) hat die Funktion LoadFromStream mit Formatübergabe (in meinem Fall sfJSON).

Wenn ich das so verwende, und in meiner Query Daten mit Umlauten drin sind funktioniert das LoadFromStream nicht mehr. Was mach ich falsch? Ich bin davon ausgegangen die Komponenten sind in der Lage den Formatierungsgedöns selbst zu machen. Leider kommt die Meldung das FDSTAN das JSON nicht lesen kann. Immer bei den Umlauten. Irgendwelche Tipps? ich find nix:pale:

Uwe Raabe 18. Okt 2021 13:09

AW: Dataset austausch über JSON
 
Das ist mir zu viel Spekulation. Hast du ein konkretes Beispiel?

fisipjm 18. Okt 2021 14:15

AW: Dataset austausch über JSON
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
procedure TForm5.Button1Click(Sender: TObject);
var
  lStringStream: TstringStream;
begin
  lstringStream := tstringstream.create;
  try
    FDMemTable1.SaveToStream(lStringStream,sfJSON);
    FDMemTable2.LoadFromStream(lStringStream,sfJSON);
  finally
    lStringStream.free;
  end;

end;
Beispielprojekt im Anhang, hab beim erstellen bemerkt, dass es scheinbar nicht an denUmlauten liegt, die Frage bleibt im Grundsatz aber die gleiche. Warum tut es nicht?

tamasker 18. Okt 2021 14:55

AW: Dataset austausch über JSON
 
Hängt vermutlich mit der Positionierung im Stream zusammen.

Versuche doch mal die Position zurückzusetzen:

Delphi-Quellcode:
FDMemTable1.SaveToStream(lStringStream,sfJSON);
[B]lstringStream.Position := 0;[/B]
FDMemTable2.LoadFromStream(lStringStream,sfJSON);

Uwe Raabe 18. Okt 2021 15:17

AW: Dataset austausch über JSON
 
Der Hinweis mit der Position ist richtig. Das trifft aber auf dein eigentliches Problem nicht zu. Aus deiner Frage bei StackOverflow sind ja zwei Code-Snippets zu entnehmen
Delphi-Quellcode:
var lStream: TStringStream := TStringStream.create;

    FDQuery.SaveToStream(lStream,sfJSON);
    AResponse.Body.SetStream(lStream,'application/json' ,True);
Delphi-Quellcode:
lstrstream: TStringStream := TStringStream.create(EMSBackendEndpoint.Response.Content);
 aMemtable.LoadFromStream(lstrstream, sfJSON);
Der zu ladende Stream sollte also schon am Anfang stehen.

Somit geht das Testprojekt leider am eigentlichen Problem vorbei.

Kannst du denn den String-Inhalt nach SaveToStream mal zeigen?

fisipjm 18. Okt 2021 15:51

AW: Dataset austausch über JSON
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1496236)
Der Hinweis mit der Position ist richtig. Das trifft aber auf dein eigentliches Problem nicht zu. Aus deiner Frage bei StackOverflow sind ja zwei Code-Snippets zu entnehmen

Hallo Uwe, Messerscharf kombiniert :)

Zitat:

Zitat von Uwe Raabe (Beitrag 1496236)

Kannst du denn den String-Inhalt nach SaveToStream mal zeigen?

Das ist der Inhalt von einem Datensatz der definitiv Probleme macht, noch auf der Serverseite direkt nach dem SaveStream über folgenden Aufruf in eine JSon Datei gedumpt.

Delphi-Quellcode:
 tfile.WriteAllText(tpath.GetTempPath+'OutputNachSaveStream.json',Result.DataString)

Code:
..."BEZEICHNUNG":"B, Grünau","STRASSE":"",...
Das seltsame ist, in der IDE kann ich die Datei ohne muken in die Memtable laden, nur wenn ich Sie mir über den Stream vom Rersponse des BackendEndpoint hole bekomm ich die Meldung das es an Stelle 6666 knallt. Teuflisch oder :lol:

PS: JSON nachträglich gekürzt wegen irrelevanten Informationen.

fisipjm 18. Okt 2021 15:56

AW: Dataset austausch über JSON
 
Aha, ich seh da grad was.
Wenn ich den Stream Serverseitig ausgeben lasse, steht im JSON File
Code:
..."BEZEICHNUNG":"B, Grünau"...
Wenn ich mir den Stream Clientseitig ausgeben lassen, dann steht da
Code:
"BEZEICHNUNG":"B, Grünau"
Was machen wir nun mit der Erkentnis?

fisipjm 18. Okt 2021 16:19

AW: Dataset austausch über JSON
 
Okay, aus dem zerhakten (UTF8 ü in ANSI Schreibweise) Umlaut konnte ich mir jetzt folgenden Code ableiten:
Delphi-Quellcode:
var lstrstream: TStringStream := TStringStream.create(AnsiToUtf8(EndpointRead.Response.content));
Er funktioniert, aber irgendwie fühlt sich das "falsch" an, ich war der Meinung Delphi kann seit der 2009er Version schon UTF8 warum macht mir das BackenEndpoint da ein Ansi draus?
Ist das der richtige Weg? Irgendwelche bedenken?

Uwe Raabe 18. Okt 2021 16:42

AW: Dataset austausch über JSON
 
Ist das in beiden Fällen dieselbe DB-Verbindung und auch dieselbe Query? Wie sind die Felder in der DB deklariert? Verwendest du statische Felder im Backend/Client?

fisipjm 19. Okt 2021 07:34

AW: Dataset austausch über JSON
 
Moin Uwe,

Beim Server handelt es sich um einen MSSql Server, der wird über eine Connection und die Query direkt abgefragt.
Auf Clientseite hab ich eine FDMemtable mit mit LocalSQL. Ich lade also das Ergebnis der Query in eine lokale Memtable.
Die Anzeige der Felder läuft dynamisch über ein LiveBinding auf ein Stringgrid.

Auf meinen Stackoverflow Post gab es tatsächlich eine erhellende Antwort. tStringstream nimmt nicht per se UTF8, das kann manchmal abweichen. Wenn man das
Delphi-Quellcode:
tStringstream.create
mit
Delphi-Quellcode:
Tencoding.UTF8
aufruft dann läuft das wie gewünscht.

Die übertragung läuft übrigens über den RADServer und einen Get aufruf. Hab also auf der CLientseite keine RESTkomponenten, sondern den BackendEndpoint vom EMS Server. Nebenbei bemerkt, ganz große sch...., sieht in den Videos immer alles so simpel aus, ist es auch, bis man versucht das ganze im Live system zu deployen. Ich empfehle jedem der damit eine Client Server Anwendung zur Verfügung stellen will, testet es lokal direkt mit dem IIS Express, ihr müsst dafür zwar die Lizenz nochmal zurücksetzen lassen wenns an die Live Installation geht aber das ist wirklich aller Mühe wert. Ich darf aktuell ein Projekt in das schon Wochen an Arbeit geflossen sind komplett umstellen weil die Komponenten auf dem IIS nicht laufen (Batchmove Komponenten).

Vielen Dank für die Hilfe!:thumb:


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