Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TJson.ObjectToJsonString - Reihenfolge der Felder ändern (https://www.delphipraxis.net/206374-tjson-objecttojsonstring-reihenfolge-der-felder-aendern.html)

lxo 15. Dez 2020 15:01

TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Hallo,


wenn ich eine Klasse ableite werden die neuen Felder/Eigenschaften oben angehängt und nicht unten.
Kann man das irgendwie beeinflussen?

Codebeispiel


Delphi-Quellcode:

  TTest = class(TObject)
  private
   FID: Integer;
   FValue: String;
  public
   property ID: Integer read FID write FID;
   property Value: String read FValue write FValue;
 end;

  TAdditionTest = class(TTest)
  private
   FAdditionValue: String;
  public
   property AdditionValue: String read FAdditionValue write FAdditionValue;
 end;

  TTestContainer = class(TObject)
    Test: TTest;
    Addition: TTest;
  end;


procedure TForm33.Button1Click(Sender: TObject);
begin
  var lTestContainer := TTestContainer.Create;
  var lTest := TTest.Create;
  var lAdditionTest := TAdditionTest.Create;
  try
    lTestContainer.Test := lTest;
    lTestContainer.Addition := lAdditionTest;
    Memo1.Lines.Add( TJson.ObjectToJsonString( lTestContainer));
  finally
    lAdditionTest.Free;
    lTest.Free;
    lTestContainer.Free;
  end;
end;

Ergebnis

Code:
{
   "test":{
      "iD":0,
      "value":""
   },
   "addition":{
      "additionValue":"",
      "iD":0,
      "value":""
   }
}
Ich hätte erwartet das additionValue an letzter Stelle landet.

An sich wäre das für die weitere Arbeit mit dem JSONString ja nicht schlimm, wäre nur schön wenn man Eigenschaften wie z.B. ID an erster Stelle haben könnte.

Uwe Raabe 15. Dez 2020 15:39

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Die Reihenfolge wird durch den Aufruf von
Delphi-Quellcode:
TRttiType.GetFields
vorgegeben. Da wirst du nur schwer Einfluss nehmen können.

himitsu 15. Dez 2020 16:03

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Versuch mal
Delphi-Quellcode:
type
  TAdditionTest = class(TTest)
  private
    FAdditionValue: String;
  public
    property ID;
    property Value;
    property AdditionValue: String read FAdditionValue write FAdditionValue;
  end;
Eigentlich nutzt man das, um die Sichtbarkeit der Property zu ändern (Protected>Public>Published), aber vielleicht hilft's hier ja auch.

TRttiType.GetFields geht halt die Vererbung durch, also erst alles "neue" in TAdditionTest und dann wird unten das von dem Vorfahren (TTest) an die Liste angehängt.
(oben in die Liste einzufügen hielt man wohl für unnötig umständlich)

lxo 15. Dez 2020 16:14

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Zitat:

Zitat von himitsu (Beitrag 1479152)
Versuch mal
Delphi-Quellcode:
type
  TAdditionTest = class(TTest)
  private
    FAdditionValue: String;
  public
    property ID;
    property Value;
    property AdditionValue: String read FAdditionValue write FAdditionValue;
  end;
Eigentlich nutzt man das, um die Sichtbarkeit der Property zu ändern (Protected>Public>Published), aber vielleicht hilft's hier ja auch.

TRttiType.GetFields geht halt die Vererbung durch, also erst alles "neue" in TAdditionTest und dann wird unten das von dem Vorfahren (TTest) an die Liste angehängt.

Hab ich auch schon ausprobiert.
Hat leider keine Einfluss.

Wie ich das verstanden habe werden auch gar nicht die Properties verwendet sondern die F-Variablen.
Also es macht auch kein Unterschied in der Reihenfolge wenn ich die Properties anders positionieren würde.
Wenn ich die F-Variablen anders positioniere dann ändert sich auch die Reihenfolge im JSON-String.

Uwe Raabe 15. Dez 2020 16:21

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Zitat:

Zitat von lxo (Beitrag 1479158)
Wie ich das verstanden habe werden auch gar nicht die Properties verwendet sondern die F-Variablen.
Also es macht auch kein Unterschied in der Reihenfolge wenn ich die Properties anders positionieren würde.
Wenn ich die F-Variablen anders positioniere dann ändert sich auch die Reihenfolge im JSON-String.

Es würde auch ganz ohne die Properties funktionieren.

himitsu 15. Dez 2020 16:23

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Ach stimmt ja ... GetField :wall:

Ich fand es eh schon immer grenzwertig, dass zuviele Serialisierungen auf "interne" Felder gehen, anstatt auf "öffentliche" Schnittstellen (Property und/oder zumindestens "ab" public/published).



Stell dir mal vor jemand entfernt das "private" aus der RTTI (was möglich ist), da "Fremde" darin sowieso gefälligst nichts dran rumzupfuschen haben.



Eventuell hast du ja Glück und kannst mit [Attributen] diese Serialisierung beeinflussen?

lxo 15. Dez 2020 16:27

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Zitat:

Zitat von himitsu (Beitrag 1479160)
Eventuell hast du ja Glück und kannst mit [Attributen] diese Serialisierung beeinflussen?

Hab ich auch schon alles mögliche probiert, leider irgendwie nicht ...

Uwe Raabe 15. Dez 2020 17:50

AW: TJson.ObjectToJsonString - Reihenfolge der Felder ändern
 
Du könntest mit
Delphi-Quellcode:
TJson.ObjectToJsonValue
an das erzeugte Json-Objekt kommen und da die entsprechende Umsortierung vornehmen bevor du es in einen String wandelst. Ist aber auch irgendwie nicht wirklich eine Lösung.


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