AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi JsonToObject überreden ein leeres Objekt zu verarbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

JsonToObject überreden ein leeres Objekt zu verarbeiten

Ein Thema von fisipjm · begonnen am 5. Feb 2024 · letzter Beitrag vom 6. Feb 2024
Antwort Antwort
Seite 1 von 2  1 2      
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#1

JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 5. Feb 2024, 13:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#2

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 5. Feb 2024, 14:30
Kannst du mal genau zeigen, wie du den Fehler bekommst?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#3

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 07:38
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 08:49
Welche Delphi Version hast du? Hier mit 11.3 läuft das problemlos durch. Ich habe lediglich vor dem except ein ShowMessage ergänzt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#5

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 08:57
Also du kommst nicht in die Exception rein?
Ich habe es mit der 10.2 und der 12 getestet, geht bei beiden nicht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 09:24
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 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 Continue sollte auch bei LField = nil passieren.

Das QP ja aktuell nichts mehr annimmt werde ich mal andere Kanäle versuchen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#7

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 10:05
Das hatte schon jemand anderes gemeldet: https://quality.embarcadero.com/browse/RSP-43488

Ein Fix ist offenbar für Update 1 geplant.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#8

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 10:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#9

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 10:40
Sowas passiert halt, wenn man nicht genügend Unit-Tests hat...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: JsonToObject überreden ein leeres Objekt zu verarbeiten

  Alt 6. Feb 2024, 11:05
Sowas passiert halt, wenn man nicht genügend Unit-Tests hat...
Murphy's First Law für Programmierer: "Man hat nie genug Unit-Tests!"
Peter Below
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 04:25 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