![]() |
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:
Jetzt kommt Serverseitig ein neues Feld hinzu. Z.B.
{
"Value1":"Wert1", "Value2":"Wert2" }
Code:
Kein Problem, schluckt das JSONToObject, hab natürlich keine Value3 im Object, aber alles Fein.
{
"Value1":"Wert1", "Value2":"Wert2", "Value3":"Wert3" } Funktioniert sogar mit einem neuen Array:
Code:
Das einzige wo ich bisher ein Problem festgestellt habe ist, wenn in dem neuen Feld ein Objekt übergeben wird. Also in etwa so:
{
"Value1":"Wert1", "Value2":"Wert2", "NewArray": [] }
Code:
Bekomme ich JSONToObject irgendwie dazu überredet, dass er das neue Objekt ignorieren soll?
{
"Value1":"Wert1", "Value2":"Wert2", "NewObject": {} } viele Grüße PJM |
AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
Kannst du mal genau zeigen, wie du den Fehler bekommst?
|
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; |
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:
ein ShowMessage ergänzt.
except
|
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. |
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:
Das
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;
Delphi-Quellcode:
sollte auch bei
Continue
Delphi-Quellcode:
passieren.
LField = nil
Das QP ja aktuell nichts mehr annimmt werde ich mal andere Kanäle versuchen. |
AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
Das hatte schon jemand anderes gemeldet:
![]() Ein Fix ist offenbar für Update 1 geplant. |
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: |
AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
Sowas passiert halt, wenn man nicht genügend Unit-Tests hat...
|
AW: JsonToObject überreden ein leeres Objekt zu verarbeiten
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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 by Thomas Breitkreuz