![]() |
JSON To Object Problem
Hallo, ich hoffe jemand kann mir weiterhelfen, ich stelle mich einfach zu prasselig an.
Ich habe ein JSON, welches ich gern in ein Object giessen möchte:
Code:
Mein Objektc habe ich so aufgebaut:
{"energyDetails": {
"timeUnit": "YEAR", "unit": "Wh", "meters": [ { "type": "Production", "values": [ { "date": "2021-01-01 00:00:00", "value": 569863 }] }, { "type": "FeedIn", "values": [ { "date": "2021-01-01 00:00:00", "value": 285170 }] }, { "type": "SelfConsumption", "values": [ { "date": "2021-01-01 00:00:00", "value": 284693 }] }, { "type": "Purchased", "values": [ { "date": "2021-01-01 00:00:00", "value": 31557 }] }, { "type": "Consumption", "values": [ { "date": "2021-01-01 00:00:00", "value": 316250 }] } ] }}
Code:
Die Umwandlung wollte ich so machen:
TValues = class
private [JSONName('date')] Fdate: String; [JSONName('value')] Fvalue: Integer; published property date :String read Fdate write Fdate; property value :Integer read Fvalue write Fvalue; end; TMeters = class private [JSONName('type')] Ftype: String; [JSONName('values')] Fvalues: TValues; published property types : String read Ftype write Ftype; property values : TValues read Fvalues write Fvalues; end; TEnergyDetails = class private [JSONName('timeUnit')] FtimeUnit :String; [JSONName('unit')] Funit :String; [JSONName('meters')] Fmeters :TObjectList<Tmeters>; published property timeUnit : String read FtimeUnit write FtimeUnit; property units : String read Funit write Funit; property meters : TObjectList<Tmeters> read Fmeters write Fmeters; end;
Code:
Es entsteht das Object, aber ist komplett leer. :(
memo1.Text :=RESTResponse1.JSONValue.ToJSON;
energyDetail:= TJson.JsonToObject<TEnergyDetails>(memo1.Text); listbox1.Items.Add(energyDetail.timeUnit); listbox1.Items.Add(energyDetail.units); ('', '', nil) Ich steh völlig auf dem Schlauch. Kann mir bitte jemand den erhellenden Hinweis geben? Danke, Romy |
AW: JSON To Object Problem
Die JsonName-Attribute kannst du weglassen, wenn das Feld lediglich dem Json-Namen mit vorangestellten F entspricht (value -> FValue). Dabei kann der Buchstabe nach dem F auch großgeschrieben werden. Versuch's mal so:
Delphi-Quellcode:
Wenn du TObjecList für ein Json-Array verwenden willst empfehle ich diesen Artikel:
type
TValue = class private Fdate: string; Fvalue: Integer; published property date: string read Fdate write Fdate; property value: Integer read Fvalue write Fvalue; end; TValues = TArray<TValue>; TMeter = class private Ftype: string; Fvalues: TValues; public destructor Destroy; override; published property types: string read Ftype write Ftype; property values: TValues read Fvalues write Fvalues; end; TMeters = TArray<TMeter>; TEnergyDetails = class private FtimeUnit: string; Funit: string; Fmeters: TMeters; public destructor Destroy; override; published property timeUnit: string read FtimeUnit; property units: string read Funit; property meters: TMeters read Fmeters; end; implementation destructor TMeter.Destroy; var I: Integer; begin for I := 0 to Length(FValues) - 1 do FValues[I].Free; inherited; end; destructor TEnergyDetails.Destroy; var I: Integer; begin for I := 0 to Length(Fmeters) - 1 do Fmeters[I].Free; inherited; end; ![]() |
AW: JSON To Object Problem
Fehlt noch was:
Delphi-Quellcode:
Aufruf dann so:
TWrapper = class
private { wrapper ist nicht owner! } FEnergyDetails: TEnergyDetails; public property EnergyDetails: TEnergyDetails read FEnergyDetails; end;
Delphi-Quellcode:
memo1.Text :=RESTResponse1.JSONValue.ToJSON;
wrapper:= TJson.JsonToObject<TWrapper>(memo1.Text); try energyDetail := wrapper.EnergyDetails; finally wrapper.Free; end; listbox1.Items.Add(EnergyDetail.timeUnit); listbox1.Items.Add(EnergyDetail.units); |
AW: JSON To Object Problem
Danke für Deine Hilfe.
Ich habe Deinen Vorschlag erst Mal übernommen, aber es funktioniert noch nicht.
Code:
Ich dachte jetzt schon das mein
'{"energyDetails":{"timeUnit":"YEAR","unit":"Wh","meters":[{"type":"Purchased","values":[{"date":"2021-01-01 00:00:00","value":31557.0}]},{"type":"SelfConsumption","values":[{"date":"2021-01-01 00:00:00","value":284693.0}]},{"type":"FeedIn","values":[{"date":"2021-01-01 00:00:00","value":285170.0}]},{"type":"Production","values":[{"date":"2021-01-01 00:00:00","value":569863.0}]},{"type":"Consumption","values":[{"date":"2021-01-01 00:00:00","value":316250.0}]}]}}'
Code:
das Problem ist und habe eine STRING Variable als Test probiert
memo1.Text :=RESTResponse1.JSONValue.ToJSON;
Code:
War aber nicht das Problem :(
teststring :=RESTResponse1.JSONValue.ToJSON;
energyDetail:= TJson.JsonToObject<TEnergyDetails>(teststring); Das Object bleibt leer, aber dank Deiner Hilfe sind die "meters" nicht mehr nil. -> ('', '', ()) Hab ich mein Object nicht richtig für das JSON vorbereitet? Danke, Romy |
AW: JSON To Object Problem
OMG wie cool, es geht.
Tausend Dank. :-D Romy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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