![]() |
TDictionary to JSON und zurück
Hallo zusammen
Ich experimentiere gerade mit REST.JSON und das funktioniert ziemlich gut, aber hier habe ich ein Problem: Ich möchte ein TDictionary<string,TEintragClass> in ein JSON String und zurück umwandeln. Das zurück geht aber leider noch nicht, da bringt er mir eine Exception: Intern: Typ System.Generics.Collections.TDictionary<...> kann nicht instantiiert werden. Folgendes habe ich gemacht:
Delphi-Quellcode:
Was habe ich übersehen? :oops:
TEintragClass = class
private FOriginalFilename: string; FLastModified: TDateTime; FAnzahl: Integer; FStrings: TStringList; end; procedure TForm8.Button1Click(Sender: TObject); var Dict : TDictionary<string, TEintragClass>; Eintrag: TEintragClass; Liste: TStringList; begin Liste := TStringList.Create(); Eintrag := TEintragClass.Create(); Dict := TDictionary<string,TEintragClass>.Create; Liste.Add('File1'); Liste.Add('File2'); Eintrag.FOriginalFilename := 'abc'; Eintrag.FLastModified := Now(); Eintrag.FAnzahl := 3; Eintrag.FStrings := Liste; Dict.Add('asd',Eintrag); Dict.Add('asd2',Eintrag); Memo1.Lines.Text := TJson.ObjectToJsonString(Dict); Dict.Free; Eintrag.Free; Liste.Free; end; procedure TForm8.Button2Click(Sender: TObject); var Dict2 : TDictionary<string, TEintragClass>; begin Dict2 := TJson.JsonToObject<TDictionary<string, TEintragClass>>(Memo1.Lines.Text); // Da knallts Dict2.Free; end; |
AW: TDictionary to JSON und zurück
Mach doch aus der TDictionary<string, TEintragsClass> einen eigenen Datentypen und spendiere dem einen parameterlosen Konstruktor.
Vielleicht ist diese Json-Implementierung zu blöd, eine generische Klasse zu instantiieren (oder Delphi ist zu minderbemittelt, keine Ahnung). |
AW: TDictionary to JSON und zurück
Wenn es an den < und > im Klassennamen geht, dann mal probieren das zu verstecken.
Delphi-Quellcode:
Nur über den Klassentyp wäre es egal, ob Generic oder nicht, denn das merkt man dort nicht.
type
TEintragDictionary = class(TDictionary<string, TEintragClass>) end; |
AW: TDictionary to JSON und zurück
Erst Mal Danke für die Tipps, aber leider schaffe ich es immer noch nicht, vielleicht mache ich auch was falsch (bin erst seit kurzem bei Delphi).
mit
Delphi-Quellcode:
Kommt nun eine Zugriffsverletzung am gleichen Ort (...Lesen von von Adresse 00000000)
TEintragDictionary = class(TDictionary<string, TEintragClass>)
end; mit
Delphi-Quellcode:
Gibts die gleiche Exception schon beim Umwandeln in einen JSON String
TEintragDictionary = class(TDictionary<string, TEintragClass>)
constructor Create(); end; constructor TEintragDictionary.Create; begin inherited end; |
AW: TDictionary to JSON und zurück
hmmm
Wenn ich
Delphi-Quellcode:
oder
TDictionary<string, string>;
Delphi-Quellcode:
mache, dann klappts wunderbar.
TDictionary<string, Integer>;
Es scheint, dass Delphi mit selber erstellten Objekten mühe hat. |
AW: TDictionary to JSON und zurück
Deine Klasse hat ja auch nix zum Serialisieren. Deklariere mal ein paar public properties.
|
AW: TDictionary to JSON und zurück
Steht denn im JSON-Text auch der Typname dieser Objekte mit drin?
|
AW: TDictionary to JSON und zurück
Als JSON String kommt mit dem Code aus dem Beitrag 1 folgender String heraus, welchen ich eigentlich auch wieder einlese und zurückwandeln möchte:
Code:
Also eigentlich alles vorhanden. Der Typname meiner Klasse wird dem REST.JsonReflect übergeben, der findet es aber, so wie ich es beim debuggen sehe, nicht.
{
"items": [[-1, "", null], [-1, "", null], [1975215994, "asd", { "originalFilename": "abc", "lastModified": "2015-06-10T13:02:31.491Z", "anzahl": 3, "strings": { "list": [["File1", null], ["File2", null], ["", null], ["", null]], "count": 2, "capacity": 4, "sorted": false, "duplicates": "dupIgnore", "caseSensitive": false, "ownsObject": false, "encoding": null, "defaultEncoding": { "codePage": 1252, "mBToWCharFlags": 0, "wCharToMBFlags": 0, "isSingleByte": true, "maxCharSize": 1 }, "delimiter": "", "lineBreak": "", "quoteChar": "", "nameValueSeparator": "", "strictDelimiter": false, "updateCount": 0, "writeBOM": true } }], [996913175, "asd2", { "originalFilename": "abc", "lastModified": "2015-06-10T13:02:31.491Z", "anzahl": 3, "strings": { "list": [["File1", null], ["File2", null], ["", null], ["", null]], "count": 2, "capacity": 4, "sorted": false, "duplicates": "dupIgnore", "caseSensitive": false, "ownsObject": false, "encoding": null, "defaultEncoding": { "codePage": 1252, "mBToWCharFlags": 0, "wCharToMBFlags": 0, "isSingleByte": true, "maxCharSize": 1 }, "delimiter": "", "lineBreak": "", "quoteChar": "", "nameValueSeparator": "", "strictDelimiter": false, "updateCount": 0, "writeBOM": true } }]], "count": 2, "growThreshold": 3, "keyCollection": null, "valueCollection": null } Properties? Die werden soweit ich weiss ignoriert: ![]() EDIT: Habe es mit einem Property probiert alles andere auskommentiert > genau dasselbe Ergebnis |
AW: TDictionary to JSON und zurück
Hab nun etwas herumprobiert:
Wenn ich beim Einlesen Ein Objekt nehme, scheint es zu funktionieren:
Delphi-Quellcode:
Da habe ich im Debugger alle Informationen drin in diesem Object, aber natürlich keine Felder.
procedure TForm8.Button2Click(Sender: TObject);
var Dict2 : TDictionary<string, TObject>; begin Dict2 := TJson.JsonToObject<TDictionary<string, TObject>>(Memo1.Lines.Text); // Da knallts Dict2.Free; end; Kann ich nun Das
Delphi-Quellcode:
irgendwie elegant und einfach nach
TObject
Delphi-Quellcode:
parsen ohne selber einen Parser dafür zu schreiben?
TEintragClass
Also sprich
Delphi-Quellcode:
nach
TDictionary<string, TObject>
Delphi-Quellcode:
TDictionary<string, TEintragClass>
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 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