Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   verstehe neue Vorgehensweise nicht wirklich :-( (https://www.delphipraxis.net/199185-verstehe-neue-vorgehensweise-nicht-wirklich.html)

exasoft 3. Jan 2019 09:42


verstehe neue Vorgehensweise nicht wirklich :-(
 
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

Der schöne Günther 3. Jan 2019 09:54

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
Kurz ausgedrückt: Du rutscht über ein
Delphi-Quellcode:
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
Delphi-Quellcode:
System.Json.TJsonArray
erstellen. Dann "pro Zeile" ein TJsonObject erstellen (über deinen
Delphi-Quellcode:
TJSONObjectBuilder
oder wie auch immer) und das mittels
Delphi-Quellcode:
myJsonArray.AddElement(meinFrischErstelltesObjekt)
hinzufügen.

exasoft 3. Jan 2019 10:09

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
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;

Der schöne Günther 3. Jan 2019 11:46

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
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

Sherlock 3. Jan 2019 12:16

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
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

exasoft 3. Jan 2019 12:54

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
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" :oops:

jaenicke 3. Jan 2019 13:01

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
Zitat:

Zitat von exasoft (Beitrag 1422540)
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.

Der Debugger ist kein Ersatz für ein Logging und ein Logging ist kein Ersatz für den Debugger... versucht man das, egal in welche Richtung, verschwendet man nur sehr sehr viel Zeit und macht sich das Leben schwer.

exasoft 3. Jan 2019 13:36

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
übrigens betreffend:
Zitat:

Du könntest doch:
Delphi-Quellcode:
Builder.BeginObject()
.BeginArray()
Jetzt durch dein TDataSet und jedesmal machen Builder.BeginObject(..) bla bla .EndObject()
Wenn du damit fertig bist:
Delphi-Quellcode:
Builder.EndArray().EndObject()

komme ich nicht weiter.
sobald ich "scannen" bzw das 2. Mal auf Builder zugreifen will, bekomme ich "dieser Vorgang ist nicht zulässig, nachdem Paare oder Elemente hinzugefügt wurden."

Delphi-Quellcode:
    Builder
      .BeginObject
        .BeginArray('wowarer');

    for var i : integer := 0 to 2 do begin
      Builder
        .BeginObject
          .Add('symbol', i.ToString)
          .Add('price', i)
        .EndObject;
    end;

    Builder.BeginObject.EndObject;
    Builder.BeginObject.BeginArray('wowarer').EndArray;
ne Idee? Aber vielleicht ist meine Denke auch völlig falsch. Ich stelle mir das, wie ein Stream vor (also "Fluent Interface") - die jeweils letzte Anweisung liefert das Objekt für die Parent-Anweisung, richtig?

Tks..

exasoft 3. Jan 2019 13:41

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
@jaenicke: Hast ja recht - ich werde mich bessern. Steht jetzt auch auf der Liste..

Neutral General 3. Jan 2019 14:48

AW: verstehe neue Vorgehensweise nicht wirklich :-(
 
Die letzten beide Zeilen müssen so sein:
Delphi-Quellcode:
Builder.EndArray;
Builder.EndObject;
// oder Builder.EndArray.EndObject;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 1 von 3  1 23      

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