Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   System.JSON TJsonObjectBuilder - fehlende Callback-Funktion (https://www.delphipraxis.net/198874-system-json-tjsonobjectbuilder-fehlende-callback-funktion.html)

TigerLilly 6. Dez 2018 22:21

System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Ich habe diesen Code:

Code:
procedure TTabbedwithNavigationForm.DataToJSON;
var
  Builder: TJSONObjectBuilder;
  FileStream: TFileStream;
  sPath: string;
  StreamWriter: TStreamWriter;
  Writer: TJsonTextWriter;
begin
  sPath:= TPath.GetLibraryPath;
  FileStream := TFileStream.Create(sPath+'data.json',fmCreate);
  StreamWriter:= TStreamWriter.Create(FileStream);
  Writer := TJsonTextWriter.Create(StreamWriter);
  Writer.Formatting := TJsonFormatting.Indented;
  Builder := TJSONObjectBuilder.Create(Writer);
  Builder
    .BeginObject
      .BeginArray('Transaction')
        .BeginObject.Add('id', 662713)
          .Add('firstName', 'John')
          .Add('lastName', 'Doe')
          .Add('price', 2.1)
          .AddNull('parent_id')
          .Add('validated', true)
          .BeginObject('protocol')
            .Add('timestamp',DateTimeToStr(now))
            .Add('action','plus')
          .EndObject
        .EndObject
      .EndArray
    .EndObject;
  mmoLog.Lines.Add(Builder.AsJSON); <- Hier kommt die Meldung: Dieser Vorgang ist ohne zugewiesene Callback-Funktion nicht zulässig.
end;

Frage 1: Welche callback-Funktion ist da gemeint?
Frage 2: Ich möchte den JSON String haben, der in die Datei gespeichert wird. Mir gelingt bis jetzt nur eines von beiden: Entweder mit einem anderen Stream + dann habe ich den Text oder so wie hier, dann habe ich die Datei. Aber beides gleichzeitig?


Was übersehe ich?
Danke!

Rollo62 7. Dez 2018 08:45

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Hilft dir das ?
https://www.delphipraxis.net/194193-...exception.html

Rollo

TigerLilly 7. Dez 2018 09:40

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Eigentlich nicht. Die Writer sind ja assigned. Im Code sehe ich zwar, dass das Fehlen eines Readers ein Problem ist, aber wo und warum ich den ins Spiel bringen soll, erkenne ich nicht.

TigerLilly 7. Dez 2018 09:43

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Nachtrag: Ich möchte das Umkopieren vermeiden. Ich könnte ja den JSION String erzeugen, den einer StringList zuweisen und dann erst speichern. Aber da das ein großes JSON Konstrukt ist (bzw wird) würde ich das gern vermeiden.

Schokohase 7. Dez 2018 09:51

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also wenn ich das ausführen lasse, dann stoppt der Debugger (wegen besagter Exception) da
Anhang 50408
Damit ist doch klar, woran es liegt und auch welche Callback-Funktion gemeint ist.

Nimm den Konstruktor wo du die GetReader-CallbackMethode angeben kannst und gib eine an.

TigerLilly 7. Dez 2018 11:27

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Die Doku sagt, AsJSON liefert den JSON String zurück, sagt aber nichts von einem Reader.
Ich habe jetzt kein Delphi bei der Hand, aber ich erinnere mich nur an Konstruktoren für WRITER.

Da es für dich so klar ist, was muss ich tun, damit mein Beispiel funktioniert?

Schokohase 7. Dez 2018 11:32

AW: System.JSON TJsonObjectBuilder - fehlende Callback-Funktion
 
Zitat:

Zitat von TigerLilly (Beitrag 1420296)
Die Doku sagt, AsJSON liefert den JSON String zurück, sagt aber nichts von einem Reader.
Ich habe jetzt kein Delphi bei der Hand, aber ich erinnere mich nur an Konstruktoren für WRITER.

Da es für dich so klar ist, was muss ich tun, damit mein Beispiel funktioniert?

Hier der Auszug aus dem Quelltext
Delphi-Quellcode:
    constructor Create(const AJSONWriter: TJSONWriter); overload;
    constructor Create(const AJSONWriter: TJSONWriter;
      AGetReader: TGetReaderProc; AReleaseReader: TReleaseReaderProc;
      AResetWriter: TResetWriterProc); overload;
Siehst du den zweiten Konstruktor, den mit den
Delphi-Quellcode:
T...Proc
Argumenten?

Den musst du verwenden (wie ich schon geschrieben habe).


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