AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein verstehe neue Vorgehensweise nicht wirklich :-(
Thema durchsuchen
Ansicht
Themen-Optionen

verstehe neue Vorgehensweise nicht wirklich :-(

Ein Thema von exasoft · begonnen am 3. Jan 2019 · letzter Beitrag vom 4. Jan 2019
Antwort Antwort
Benutzerbild von exasoft
exasoft

Registriert seit: 19. Nov 2015
Ort: Frankfurt
47 Beiträge
 
#1

verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 09:42
Moin,
arbeite mich gerade in "neuere Techniken" ein - komme aber mit folgendem Beispiel nicht klar.

(Daten per "neuem" JSONObjectBuilder-Objekt aufbereiten)

Delphi-Quellcode:
var
  StringWriter: TStringWriter;
  Writer: TJsonTextWriter;
  Builder: TJSONObjectBuilder;
begin
...
  // entspr. objekte erstellen..
  StringWriter := TStringWriter.Create();
  Writer := TJsonTextWriter.Create(StringWriter);
  Builder := TJSONObjectBuilder.Create(Writer);

    Builder
    .BeginObject
      .BeginArray('wowarer')
        .BeginObject
          .Add('symbol', 'ACME')
          .Add('price', 75.5)
        .EndObject
        .BeginObject
          .Add('symbol', 'COOL')
          .Add('price', 21.7)
        .EndObject
      .EndArray
    .EndObject;
Wenn ich jetzt aber die Daten aus einer DB aufbereiten will: Wie kann ich dann einen "BeginObject" und "EndObject" PRO DB-Zeile machen?

Wäre super..

Tks

Geändert von mkinzler ( 3. Jan 2019 um 10:02 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 09:54
Kurz ausgedrückt: Du rutscht über ein TDataSet drüber und willst für jede Zeile ein neues Json-Objekt in ein Json-Array stecken. Richtig?


Ich würde erst einmal dein System.Json.TJsonArray erstellen. Dann "pro Zeile" ein TJsonObject erstellen (über deinen TJSONObjectBuilder oder wie auch immer) und das mittels myJsonArray.AddElement(meinFrischErstelltesObjekt) hinzufügen.
  Mit Zitat antworten Zitat
Benutzerbild von exasoft
exasoft

Registriert seit: 19. Nov 2015
Ort: Frankfurt
47 Beiträge
 
#3

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 10:09
so hatte ich es auch immer gemacht - dachte nur das ginge auch irgendwie mit dieser "Punktnotationsarie".

Danke..

Delphi-Quellcode:
      // json-array für die rückgabe der daten erstellen..
      a := TJSONArray.Create;
      try
        // DARF EIGTL NUR EINEN DS FINDEN - source aber für später so belassen
        // auf ersten satz pos..
        dm.qryWoIsser.First;
        // saetze scannen..
        while (NOT dm.qryWoIsser.Eof) do begin
          // fuer jeden ds ein json-objekt erstellen..
          o := TJSONObject.Create;
          // fuer jedes gewuenschte qry-feld einen eintrag im json-objekt erstellen..
          o.AddPair('id',dm.qryWoIsser.FieldByName('id').AsString);
          o.AddPair('location',dm.qryWoIsser.FieldByName('location').AsString);

          // objekt dem json-array hinzufügen..
          a.AddElement(o);
          // nächster ds..
          dm.qryWoIsser.Next;

Geändert von mkinzler ( 3. Jan 2019 um 10:14 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 11:46
Klar, gehen müsste das auch: Es zwingt dich ja niemand in einem einzigen Statement, ohne abzusetzen, das Array auch wieder direkt abzuschließen.

Du könntest doch:
  1. Builder.BeginObject()
  2. .BeginArray()
  3. Jetzt durch dein TDataSet und jedesmal machen Builder.BeginObject(..) bla bla .EndObject()
  4. Wenn du damit fertig bist: Builder.EndArray().EndObject()


Stelle ich mir nur mit vernünftiger Exception-Behandlung (Array und Objekt auf jeden Fall ordentlich abschließen) etwas schwieriger vor.


PS: Genannt wird die "neuere Technik" übrigens "Fluent Interface".
http://blog.marcocantu.com/blog/fluent_delphi.html

Geändert von Der schöne Günther ( 3. Jan 2019 um 11:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#5

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 12:16
Na, da wünsche ich viel Spaß beim Debuggen. Allein um mit F7 endlich in den richtigen Teil reinzukommen. Wie kommt eigentlich die Code-Formatierung mit dieser Geschichte klar? Wird das so wie hier zu sehen formatiert, oder klatscht der wieder alles zusammen in eine Zeile?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von exasoft
exasoft

Registriert seit: 19. Nov 2015
Ort: Frankfurt
47 Beiträge
 
#6

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 12:54
ich habe da immer ne "unsichtbare" Protokollierung mitlaufen - debugger bin ich kein Fan von. Ich weiß... - aber das kann ich mir live bei Kunden ansehen, mailen lassen, etc.

Bin eigentlich auch kein großer Fan der ganzen neuen Gimmicks - aber man sollte sie halt kennen und manche sind auch echt cool. Trete halt seit rund 10 Jahren auf meinem "Wissen" rum und erlebe Delphi/FMX gerade "neu", weil ich grad Zeit hab.

Bin an der Sache noch dran und, sollte ich es hinbekommen, dann post ich mal was zum "verbessern"
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 3. Jan 2019, 16:28
Im Prinzip stand alles was du wissen musst in der ersten Antwort:

Kurz ausgedrückt: Du rutscht über ein TDataSet drüber und willst für jede Zeile ein neues Json-Objekt in ein Json-Array stecken. Richtig?


Ich würde erst einmal dein System.Json.TJsonArray erstellen. Dann "pro Zeile" ein TJsonObject erstellen (über deinen TJSONObjectBuilder oder wie auch immer) und das mittels myJsonArray.AddElement(meinFrischErstelltesObjekt) hinzufügen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von exasoft
exasoft

Registriert seit: 19. Nov 2015
Ort: Frankfurt
47 Beiträge
 
#8

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 4. Jan 2019, 11:31
Moin @ALL,
also, habs jetzt so (s.u.) gemacht und klappt auch super (s. Anhang).
Bitte nicht über die ausführlichen Kommentare wundern - dient als Lehrstoff. Und falls noch jemand etwas anzumerken hätte - alls her damit.

Tks nochmal..

Delphi-Quellcode:
  // json-antwort aufbereiten..
  // entspr. objekte erstellen..
  StringWriter := TStringWriter.Create();
  Writer := TJsonTextWriter.Create(StringWriter);

  try
    // json-antwort formatiert aufbereiten??
    if uglobal.JSON_FORMATIEREN then
      Writer.Formatting := TJsonFormatting.Indented;

    // beginn json-objekt für tabelle..
    Writer.WriteStartObject;
    Writer.WritePropertyName('wowarer');
    // beginn json-array für tabelle..
    Writer.WriteStartArray;

    // datensaetze scannen..
    dm.qryWoWarer.First; // vorsichtshalber auf ersten ds
    // info: diese form des scannens, weil man desöfteren im scanvorgang einen index (i) gebrauchen kann
    // alternativ: while NOT dm.qryWoWarer.Eof do begin - dann entfällt "nächster datensaetz"
    for var i: integer := 0 to dm.qryWoWarer.RecordCount - 1 do begin
      // für jeden ds ein json-objekt erstellen..
      // beginn json-objekt..
      Writer.WriteStartObject;
      // entspr. tabellen-felder mit deren werten in json-objekt..
      Writer.WritePropertyName('id');
      Writer.WriteValue(dm.qryWoWarer.FieldByName('id').AsInteger);
      Writer.WritePropertyName('location');
      Writer.WriteValue(dm.qryWoWarer.FieldByName('location').AsString);
      // ende json-objekt..
      Writer.WriteEndObject;
      // nächster datensaetz..
      dm.qryWoWarer.Next;
    end;

    // ende json-array für tabelle..
    Writer.WriteEndArray;
    // ende json-objekt für tabelle..
    Writer.WriteEndObject;

    // prot..
    if uglobal.OGProtokoll.Protokollieren then begin
      uglobal.AddToProtokoll('Anforderung gesendet');
      if uglobal.OGProtokoll.ProtokollierenJSONString then begin
        // JSON-String formatiert ausgeben..
        uglobal.AddToProtokoll('sende:' + sLineBreak + StringWriter.ToString,false,true);
      end;
    end;

    // senden..
    // ContentType setzen, damit der client weiss welche art daten..
    Response.ContentType := 'text/plain; charset="UTF-8"';
    // und, weil webbies... - alles als string liefern..
    Response.Content := StringWriter.ToString;
  finally
    Writer.Free;
    StringWriter.Free;
  end;
Angehängte Grafiken
Dateityp: png webserver.png (39,3 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 4. Jan 2019, 11:42
Wow, nett. WriteStartObject() und Konsorten kannte ich noch nicht. Das ist natürlich besser 👍

Mir würde nur das fehlende try..finally zwischen WriteStartObject() und WriteEndObject() (analog das Array) stören. Und den inneren Teil mit der Schleife in eine eigene Methode rausziehen, das ist ja schon etwas lang.


Die WriteStartXX-Dinge sind mir echt neu. Wieder was gelernt 😊
  Mit Zitat antworten Zitat
Benutzerbild von exasoft
exasoft

Registriert seit: 19. Nov 2015
Ort: Frankfurt
47 Beiträge
 
#10

AW: verstehe neue Vorgehensweise nicht wirklich :-(

  Alt 4. Jan 2019, 11:52
ich weiß, aber optimiert wird immer erst später Baue gerade ein DatenModul rein..
  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 00:02 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