Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi JsonToObject überreden ein leeres Objekt zu verarbeiten (https://www.delphipraxis.net/214595-jsontoobject-ueberreden-ein-leeres-objekt-zu-verarbeiten.html)

fisipjm 5. Feb 2024 13:48

JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Hi,

Ich versuche gerade, eine Anwendung, die JsonToObject verwendet ein bisschen resistenter zu machen, wenn es um das Thema Änderung in der Datenstruktur geht.

Ich habe folgendes JSON:
Code:
{
  "Value1":"Wert1",
  "Value2":"Wert2"
}
Jetzt kommt Serverseitig ein neues Feld hinzu. Z.B.
Code:
{
  "Value1":"Wert1",
  "Value2":"Wert2",
  "Value3":"Wert3"
}
Kein Problem, schluckt das JSONToObject, hab natürlich keine Value3 im Object, aber alles Fein.
Funktioniert sogar mit einem neuen Array:
Code:
{
  "Value1":"Wert1",
  "Value2":"Wert2",
  "NewArray": []
}
Das einzige wo ich bisher ein Problem festgestellt habe ist, wenn in dem neuen Feld ein Objekt übergeben wird. Also in etwa so:
Code:
{
  "Value1":"Wert1",
  "Value2":"Wert2",
  "NewObject": {}
}
Bekomme ich JSONToObject irgendwie dazu überredet, dass er das neue Objekt ignorieren soll?

viele Grüße
PJM

Uwe Raabe 5. Feb 2024 14:30

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Kannst du mal genau zeigen, wie du den Fehler bekommst?

fisipjm 6. Feb 2024 07:38

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Moin Uwe,

hier mal ein Stück Code. Das Müsste es eigentlich recht gut verdeutlichen:

Delphi-Quellcode:
uses
  ...REST.JSON...



type
  TMyJSONObject = class
  private
    FValue1: String;
    FValue2: String;
  public
    property Value1: String read FValue1 write FValue1;
    property Value2: String read FValue2 write FValue2;
  end;

type
  TMyJsonNestedObject = class
  private
    FNeuesLeeresObject: TMyJSONObject;
  published
    property NeuesLeeresObject: TMyJSONObject read FNeuesLeeresObject write FNeuesLeeresObject;
  end;

procedure Foo;
var
  MyJSONObject : TMyJSONObject;
  MyJsonNestedObject: TMyJsonNestedObject;
begin
  MyJSONObject := TMyJSONObject.create;
  try
    MyJsonNestedObject := TMyJsonNestedObject.Create;
    try
      MyJSONObject := TJson.JsonToObject<TMyJSONObject>('{'+
                                                            '"Value1":"Ich bin Wert1",'+
                                                            '"Value2":"Ich bin Wert2"'+
                                                        '}');
      ShowMessage('Geht');

      MyJSONObject := TJson.JsonToObject<TMyJSONObject>('{'+
                                                            '"Value1":"Ich bin Wert1",'+
                                                            '"Value2":"Ich bin Wert2",'+
                                                            '"NeuerWert":"-NeuerWert-"'+
                                                        '}');
      ShowMessage('Geht immer noch');

      MyJSONObject := TJson.JsonToObject<TMyJSONObject>('{'+
                                                            '"Value1":"Ich bin Wert1",'+
                                                            '"Value2":"Ich bin Wert2",'+
                                                            '"NeuerWert":"-NeuerWert-",'+
                                                            '"NeuesLeeresArray":["ich","hab","sogar","Werte"]'+
                                                        '}');
      ShowMessage('Geht weiterhin');

      MyJSONObject := TJson.JsonToObject<TMyJSONObject>('{'+
                                                            '"Value1":"Ich bin Wert1",'+
                                                            '"Value2":"Ich bin Wert2",'+
                                                            '"NeuerWert":"-NeuerWert-",'+
                                                            '"NeuesLeeresArray":["ich","hab","sogar","Werte"],'+
                                                            '"NeuesLeeresObject":[{}]'+
                                                        '}');
      ShowMessage('Geht sogar im Array');

      try
        MyJSONObject := TJson.JsonToObject<TMyJSONObject>('{'+
                                                              '"Value1":"Ich bin Wert1",'+
                                                              '"Value2":"Ich bin Wert2",'+
                                                              '"NeuerWert":"-NeuerWert-",'+
                                                              '"NeuesLeeresArray":["ich","hab","sogar","Werte"],'+
                                                              '"NeuesLeeresObject":{}'+
                                                          '}');
      except
        on e:exception do
        begin
          showmessage(e.ClassName + ' - ' + e.Message);
        end;
      end;

      MyJsonNestedObject := TJson.JsonToObject<TMyJsonNestedObject>('{'+
                                                              '"Value1":"Ich bin Wert1",'+
                                                              '"Value2":"Ich bin Wert2",'+
                                                              '"NeuerWert":"-NeuerWert-",'+
                                                              '"NeuesLeeresArray":["ich","hab","sogar","Werte"],'+
                                                              '"NeuesLeeresObject":{}'+
                                                          '}');
      showmessage('Geht wieder');

      MyJsonNestedObject := TJson.JsonToObject<TMyJsonNestedObject>('{'+
                                                              '"Value1":"Ich bin Wert1",'+
                                                              '"Value2":"Ich bin Wert2",'+
                                                              '"NeuerWert":"-NeuerWert-",'+
                                                              '"NeuesLeeresArray":["ich","hab","sogar","Werte"],'+
                                                              '"NeuesLeeresObject":{"Value1":"Nested Value1"}'+
                                                          '}');
      showmessage('Sogar mit Wert: '+MyJsonNestedObject.NeuesLeeresObject.FValue1);
    finally
      MyJsonNestedObject.Free;
    end;
  finally
    MyJSONObject.Free;
  end;
end;

Uwe Raabe 6. Feb 2024 08:49

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Welche Delphi Version hast du? Hier mit 11.3 läuft das problemlos durch. Ich habe lediglich vor dem
Delphi-Quellcode:
except
ein ShowMessage ergänzt.

fisipjm 6. Feb 2024 08:57

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Also du kommst nicht in die Exception rein?
Ich habe es mit der 10.2 und der 12 getestet, geht bei beiden nicht.

Uwe Raabe 6. Feb 2024 09:24

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
In der Tat, mit Delphi 12 bekomme ich den Fehler auch. Der relevante Code ist dort neu hinzugekommen, versäumt aber die Prüfung auf
Delphi-Quellcode:
LField <> nil
.

Eigentlich sollte die Prüfung schon viel früher erfolgen:
Delphi-Quellcode:
    LField := GetFieldType(Data, FieldName);
    if (LField <> nil) and not (LField.DataType.TypeKind in [tkClass, tkInterface]) and not LField.IsWritable then
    begin
      Inc(I);
      Continue;
    end;
Das
Delphi-Quellcode:
Continue
sollte auch bei
Delphi-Quellcode:
LField = nil
passieren.

Das QP ja aktuell nichts mehr annimmt werde ich mal andere Kanäle versuchen.

Uwe Raabe 6. Feb 2024 10:05

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Das hatte schon jemand anderes gemeldet: https://quality.embarcadero.com/browse/RSP-43488

Ein Fix ist offenbar für Update 1 geplant.

fisipjm 6. Feb 2024 10:31

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Ging also in der 10.2 nicht.
Ging dann mal in der 11.2
Und geht dann in der 12.0 wieder nicht :(

Ist doch zum weine. Danke für deine Recherche. :thumb:

Uwe Raabe 6. Feb 2024 10:40

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Sowas passiert halt, wenn man nicht genügend Unit-Tests hat...

peterbelow 6. Feb 2024 11:05

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1533075)
Sowas passiert halt, wenn man nicht genügend Unit-Tests hat...

Murphy's First Law für Programmierer: "Man hat nie genug Unit-Tests!"


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:54 Uhr.
Seite 1 von 2  1 2      

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