Laden...

Deserialisierung - JSON - Befüllen von Properties

Erstellt von Glowhollow vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.408 Views
G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren
Deserialisierung - JSON - Befüllen von Properties

Hallo,

ich habe Einen Deserialisierer eines JSON Strings gebastelt, habe hier jedoch ein kleines Problem.

Der JSON String, wird je nach Typ in verschiedene Substrings zerlegt, welche mit einer FromJSON Methode an die entsprechende Klasse per getter und setter mit Werten befüllt.

Diese FromJSON Methode wurde von einem JSON Parser übernommen, er befüllt zuverlässig, die verknüpfte Klasse per getter und Setter mit Werten.

Die Properties sind auch über eine Foreach schleife auslesbar.

Da aber, aufgrund der Komplexität, ich den JSON String, je nach Struktur iterieren muß und das ganze übergebe an FromJSON kommt es dazu, das keine Möglichkeit habe, die Klasse "in einem Schwung" mit werten zu befüllen.

So splittet sich meine "Befüllungsmethode" in 3 unterparts, welche jeweils einzeln in die dafür gesehene Klasse schreiben würde.

Ich habe das Problem, das ich (man möge mir hier vielleicht meine Wortwahl verzeihen, da ich im Moment nicht 100% akkurat die Bezeichnung dafür habe) - die Properties an 3 unterschiedlichen Stelle befüllen, aber der Enumerator, bei der Abfrage, ja jeweils nur auf ein Objekt referenziert.

Dort besteht das problem, das in der foreach schleife, natürlich einige Properties nicht gesetzt sind, und aufgrund dessen, der Objektverweis nicht auf die Instanz festgelegt ist, was zur besagten Fehlermeldung führt.

Im Prinzip würde ich gerne so etwas in dieser art bauen.


JSONObjects (eine Klasse) contents = new JSONObjects();

contents = ersteteilbefüllungderproperties.FromJSON<JSONObjects>();
contents += zweiteteilbefüllungderproperties.FromJSON<JSONObjects>();
contents += letzteteilbefüllungderproperties.FromJSON<JSONObjects>();

for each (var items in contents)
{
ConsoleWriteLine(items.ToString());
}


Ich hatte auch erst mal angedacht eine List<JSONObjects> zu erstellen, und die per contents.Add(werte) zu befüllen, aber irgendwie stell ich mich zu dumm an und hab immer noch den fehlenden Objektverweis.

Ich bin noch nicht hundertprozentig fertig mit meiner deserialisierung, da der JSON String auch noch in übergeordnete Arrays unterteilt ist und ich diese auch noch befüllen muß.

Ich würde aber gerne diesen teilschritt lösen.

Jemand ne Idee wie ich das am besten löse ?

Sry. falls ich mich etwas undeutlich und kompliziert ausgedrückt habe. Ich bin da nicht so gut, solche Dinge zu erklären.

3.511 Beiträge seit 2005
vor 5 Jahren

Nur so als Frage: Warum nutzt du nicht Json.NET (Newtonsoft)? Etabliertes Package, welches so ziemlich überall genutzt wird.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Danke für die Frage. Unsere eingesetzte Software kann leider mit dem newtonSoft nicht zusammenarbeiten (warum auch immer). Ich habe die vorgabe, das nicht zu nutzen.

Und ergänzend sei dazu gesagt, das der JavaScriptDeserializer nicht verwendbar ist, da ich je nach zurückgegebenem JSON-String, manche Properties (die aus Klassen bestehen, die eigene Properties haben) (als beispiel Json-String " {"content":{"link":"value", "wert2","value"}}) die aber auch mal ein leerstring seinen können.

Da eine Abfangen über den getter und setter im JavaScriptSerializer nicht möglich hist, mußte ich sozusagen das ganze in Eigenregie entwickeln.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Th69, nimms mir bitte nicht übel. Ich habe in Zusammenarbeit mit unserem erfahrenen Entwickler die Optionen mit dem JavaScriptDeserialisierer ausgelotet. Er ist für diese Zwecke nicht zu gebrauchen.

Ich weiß jetzt auch nicht warum wir Dinge besprechen müssen, die mit der Frage wenig zu tun hat.

Wenn ich eine andere Lösung hätte, hätte ich diese auch verwendet, ja auch ich bin faul.


public void CopyValues<T>(T target, T source)
{
    Type t = typeof(T);

    var properties = t.GetProperties().Where(prop => prop.CanRead && prop.CanWrite);

    foreach (var prop in properties)
    {
        var value = prop.GetValue(source, null);
        if (value != null)
             prop.SetValue(target, value, null);
    }
}

das wäre übrigens ein Lösungsansatz gewesen. Aber danke.

4.939 Beiträge seit 2008
vor 5 Jahren

Wie bitte?
Du hast doch geschrieben:

Dort besteht das problem, das in der foreach schleife, natürlich einige Properties nicht gesetzt sind, und aufgrund dessen, der Objektverweis nicht auf die Instanz festgelegt ist, was zur besagten Fehlermeldung führt.

Und darauf habe ich geantwortet.

G
Glowhollow Themenstarter:in
74 Beiträge seit 2018
vor 5 Jahren

Hallo. Vielleicht sollte ich mich hier entschuldigen. Obwohl das nicht meine Absicht war hier irgendjemand zu beleidigen. Ich habe Abt per pm meine privat situation erläutert und hoffe das er sich meiner in irgendeiner Form annimmt und vermittelt.

Ich bezog mich - vielleicht war der threadtitel falsch gewählt- auf das Properties Problem. Was sich für euch erst mal zweitrangig klassifiziert wurde und dadurch das Gespräch sich in eine andere Richtung verschob.

Ich habe halt noch nicht das expertenwissen mich da so klar auszudrücken das es allgemeinverständlich ist. Sorry nochmal.