AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken DataSnap ein TFDJSONDataSets als TJSONObject übertragen
Thema durchsuchen
Ansicht
Themen-Optionen

DataSnap ein TFDJSONDataSets als TJSONObject übertragen

Ein Thema von Kostas · begonnen am 25. Mär 2015 · letzter Beitrag vom 26. Mär 2015
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#1

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 14:03
Ich habe etwas feststellen können.
Wenn ich die Query per SaveToFile als Jason exportiere, bekomme ich ein sauberes JASON.
Der TFDJSONDataSetsWriter erzeugt ein binäres Format.

könnte hier das Problem sein?

Delphi-Quellcode:
function TdmDALZMI.GetBau(BauNr:integer): TFDJSONDataSets;
begin
  qrGetBau.Active := False;
  qrGetBau.Params[0].Value := BauNr;
  qrGetBau.Active := True;
  qrGetBau.SaveToFile('f:\JSONBau.txt',TFDStorageFormat.sfJSON); <<< String Klartext

  Result := TFDJSONDataSets.Create;
  TFDJSONDataSetsWriter.ListAdd(Result, qrGetBau);
end;


function TdmDALZMI.GetBauJSON(BauNr:integer): TJSONObject;
var
  LDataSets: TFDJSONDataSets;
  s:TStringList;
begin
  LDataSets := GetBau(BauNr);
  try
    Result := TJSONObject.Create;
    TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result);

    s:=TStringList.Create;
    s.Text := result.ToString;
    s.SaveToFile('f:\JSON.txt'); <<<<< Binärer Inhalt
    s.Free;


  finally
    LDataSets.Free;
  end;
end;

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#2

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 14:29
Wenn ich die Query per SaveToFile als Jason exportiere, bekomme ich ein sauberes JASON.
Der TFDJSONDataSetsWriter erzeugt ein binäres Format.
Das ist richtig, aber es erklärt jetzt nicht so offensichtlich die Fehlermeldung.

Allerdings kannst du über SaveToStream die Query in einen TStringStream schreiben, den String übertragen und dann ebenfalls über TStringStream und LoadFromStream das DataSet wieder aufbauen. Ist nur ein Workaround - falls es eilig ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#3

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 14:47
Hallo Uwe,

ich hatte gehofft dass du als Experte mein Thread liest.

Ok, mein Vorgehen scheint also richtig zu sein.
Auf mein DataModul hatte ich ein FDStanStorageJSONLink1 und eine FDStanStorageBinLink1 die Bin Version habe ich entfernt, doch leider kein Unterschied.

Müsste das hier nicht wieder ein normales lesbares JASON erzeugen,
oder ist es normal dass das JASON immer noch Binär ist?
TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result);
Delphi-Quellcode:
function TdmDALZMI.GetBauJSON(BauNr:integer): TJSONObject;
var
  LDataSets: TFDJSONDataSets;
  s:TStringList;
begin
  LDataSets := GetBau(GauNr);
  try
    Result := TJSONObject.Create;
    TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result);

    s:=TStringList.Create;
    s.Text := result.ToString;
    s.SaveToFile('f:\JSON.txt');
    s.Free;


  finally
    LDataSets.Free;
  end;
end;

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#4

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 15:10
ich hatte gehofft dass du als Experte mein Thread liest.


Müsste das hier nicht wieder ein normales lesbares JASON erzeugen,
oder ist es normal dass das JASON immer noch Binär ist?
TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result);
Ja, das ist normal!

TFDJSONInterceptor.DataSetsToJSONObject läuft über DataSetToJSONValue und DataSetToString , was intern TFDStorageFormat.sfBinary verwendet. Insofern hast du damit also keine reelle Chance auf ein lesbares JSON.

Der gravierendste Nachteil ist dabei, daß sich das Binärformat mit jedem Delphi- bzw. FireDAC-Update ändern kann und damit die DataSets nicht mehr austauschbar sind. Bei JSON hat man wenigstens noch einen brauchbaren Ansatzpunkt.

Aber vielleicht helfen dir diese beiden Methoden weiter:

Delphi-Quellcode:
function DataSetToJSON(Source: TFDDataSet): string;
var
  stream: TStringStream;
begin
  stream := TStringStream.Create;
  try
    Source.SaveToStream(stream, TFDStorageFormat.sfJSON);
    result := stream.ToString;
  finally
    stream.Free;
  end;
end;

procedure JSONToDataSet(const Source: string; Target: TFDDataSet);
var
  stream: TStringStream;
begin
  stream := TStringStream.Create(Source);
  try
    Target.LoadFromStream(stream, TFDStorageFormat.sfJSON);
  finally
    stream.Free;
  end;
end;
Wegen der ursprünglichen Fehlermeldung muss ich nochmal forschen, wenn ich etwas Zeit habe.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#5

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 15:15
Ein herzliches Dankeschön Uwe,

werde ich gleich mal umsetzen.
Sicherlich ist es nur eine Kleinigkeit das ursprüngliche Problem, ich übersehe sicherlich etwas.

Danke nochmals,
Gruß Kostas
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#6

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 16:09
Hallo zusammen,

so funktioniert es jetzt einwandfrei. Dankeschön Uwe.

Delphi-Quellcode:
-------------------------------SERVER---------------------
function TdmDALZMI.GetBauJSONStr(BauNr:integer): String;
var
   stream: TStringStream;
begin
   stream := TStringStream.Create;
   try
     qrGetBau.Active := False;
     qrGetBau.Params[0].Value := BauNr;
     qrGetBau.Active := True;

     qrGetBau.SaveToStream(stream, TFDStorageFormat.sfJSON);
     stream.Seek(0, soFromBeginning);
     qrGetBau.Active := False;
     result := stream.DataString;
   finally
     stream.Free;
   end;
end;

-------------------------------CLIENT---------------------

procedure TdmZMI.GetBauJSONStr(BauNr:integer);
var
  LDataSetList: TFDJSONDataSets;
  LJSONStr: String;
  LZMIClient: TdmServerMethodsZMIClient;

begin
  LZMIClient := TdmServerMethodsZMIClient.Create(CMClientModule.CMCSQLConnection.DBXConnection);
  try
    LJSONStr := LZMIClient.ZMI_GetBauJSONStr(BauNr);

    JSONToDataSet(LJSONStr, mtBau);
  finally
    LZMIClient.Free;
  end;


  mtBau.Open;
end;

procedure TdmZMI.JSONToDataSet(const Source: string; Target: TFDDataSet);
var
   stream: TStringStream;
begin
   stream := TStringStream.Create(Source);
   try
     Target.LoadFromStream(stream, TFDStorageFormat.sfJSON);
   finally
     stream.Free;
   end;
end;

Gruß Kostas
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#7

AW: DataSnap ein TFDJSONDataSets als TJSONObject übertragen

  Alt 25. Mär 2015, 16:51
Noch eine Kleinigkeit,

der Server liefert das Result als String. Ist es hier sinnvoll ein TStream auszugeben
da das Select schon durchaus eine größere Datenmenge liefern könnte?

Gruß Kostas
  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 17:44 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