Laden...

Wie serialisiere ich ein JSon Dictionary mit Objekten?

Erstellt von Kriz vor 3 Jahren Letzter Beitrag vor 3 Jahren 377 Views
K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren
Wie serialisiere ich ein JSon Dictionary mit Objekten?

verwendetes Datenbanksystem: <JSON/CSV>

Guten Morgen zusammen!
Ich spiele gerade etwas mit Firebase rum und versuche gerade eine von Firebase erstellte JSON Datei in CSV zu konvertieren. Allerdings hat die JSON Datei ein recht ungewöhnliches Format und ich beiße mir daran die Zähne aus:

{  
  "-MQJvfjVAiEiMCYmIVB3" : {
    "CorrectAnswers" : 9,
    "GiveTime" : false,
    "ID" : 10,
    "ItemsPerSecond" : 0.224,
    "JustNewPLUs" : false,
    "ListID" : 0,
    "MaxPLU" : 2002,
    "MinPLU" : 57,
    "PLUListeID" : "PLUsToLearn",
    "Passed" : false,
    "Percent" : 45.0,
    "Points" : 40,
    "Querys" : 20,
    "TimeInSeconds" : 89,
    "TimeOfTesting" : "2021.01.06 - 00:41",
    "Timekeeping" : false,
    "doTimekeeping" : false
  },
  "-MQJw7XYVf0QgmlY4kjT" : {
    "CorrectAnswers" : 10,
    "GiveTime" : false,
    "ID" : 11,
    "ItemsPerSecond" : 0.229,
    "JustNewPLUs" : false,
    "ListID" : 0,
    "MaxPLU" : 2399,
    "MinPLU" : 1,
    "PLUListeID" : "049.005.003",
    "Passed" : false,
    "Percent" : 50.0,
    "Points" : 114,
    "Querys" : 20,
    "TimeInSeconds" : 87,
    "TimeOfTesting" : "2021.01.06 - 00:43",
    "Timekeeping" : false,
    "doTimekeeping" : false
  },
  "-MQJwUSCG9BvNjif3R4_" : {
    "CorrectAnswers" : 10,
    "GiveTime" : false,
    "ID" : 12,
    "ItemsPerSecond" : 0.27,
    "JustNewPLUs" : false,
    "ListID" : 0,
    "MaxPLU" : 2399,
    "MinPLU" : 291,
    "PLUListeID" : "049.005.003",
    "Passed" : false,
    "Percent" : 50.0,
    "Points" : 94,
    "Querys" : 20,
    "TimeInSeconds" : 74,
    "TimeOfTesting" : "2021.01.06 - 00:45",
    "Timekeeping" : false,
    "doTimekeeping" : false
  }
}

Der Hashcode beispielsweise "MQJw7XYVf0QgmlY4kjT" wird von Firebase erstellt und ist für mich nicht relevant.
Die Objekte, die erstellt werden sollen, sind vom Typ "Test":

public class Test
    {        
        public int CorrectAnswers { get; set; }
        public bool GiveTime { get; set; }
        public int ID { get; set; }
        public double ItemsPerSecond { get; set; }
        public bool JustNewPLUs { get; set; }
        public string ListID { get; set; }
        public int MaxPLU { get; set; }
        public int MinPLU { get; set; }
        public string PLUListID { get; set; }
        public bool Passed { get; set; }
        public double Percent { get; set; }
        public int Points { get; set; }
        public int Querys { get; set; }
        public int TimeInSeconds { get; set; }
        public DateTime TimeOfTesting { get; set; }
        public bool Tiomekeeping { get; set; }
        public bool doTimekeeping { get; set; }
    }

ich habe schon verschiedene Ansätze ausprobiert, beispielseise Helfererklassen erstellt:

public class RootObject
    {
       public List<Helper> PoolData { get; set; }
    }

public class Helper
    {
        public string ID { get; set; }
        public Test _Test { get; set; }
    }     

aber nichts führt zu Erfolg, entweder Fehlermeldungen, oder ein leeres RootObject.

Mit folgendem Code lese ich das File ein:

string json = System.IO.File.ReadAllText(@"C:/Projects/file.json");
var tmp = JsonConvert.DeserializeObject<RootObject>(json);

Vielleicht kann mir ja jemand auf die Sprünge helfen.

Vielen Dank schonmal!

D
261 Beiträge seit 2015
vor 3 Jahren

Probier das mal:

var tmp = JsonConvert.DeserializeObject<Dictionary<string, Test>>(json);

PS: Wenn du das JSON in die Zwischenablage nimmst und in Visual Studio über "Edit" --> "Paste Specia" --> "Paste JSON as Classes" einfügst, dann generiert dir Visual Studio die Klassen, die du zum Deserialisieren benötigst, automatisch. In diesem Fall erstellt er aber für jedes Objekt eine eigenen Klasse, deswegen der Umweg über das Dictionary<>.

K
Kriz Themenstarter:in
141 Beiträge seit 2017
vor 3 Jahren

So einen ähnlichen Ansatz hatte ich auch schon und bekam folgenden Fehler:

Fehlermeldung:
Newtonsoft.Json.JsonSerializationException: "Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.Dictionary`2[System.String,JSON.Test]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path '', line 1, position 1."

16.835 Beiträge seit 2008
vor 3 Jahren

Das funktioniert einwandfrei mit System.Text.Json

using System;
using System.Collections.Generic;
using System.Text.Json;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = System.IO.File.ReadAllText(@"test.json");
            var tmp = JsonSerializer.Deserialize<Dictionary<string, FirebaseEntry>>(json);

            Console.Read();
        }
    }


    public class FirebaseEntry
    {
        // Deine Properties hier
    }
}