Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie serialisiere ich ein JSon Dictionary mit Objekten?
Kriz
myCSharp.de - Member



Dabei seit:
Beiträge: 78

Themenstarter:

Wie serialisiere ich ein JSon Dictionary mit Objekten?

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Kriz am .
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 141

beantworten | zitieren | melden

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<>.
private Nachricht | Beiträge des Benutzers
Kriz
myCSharp.de - Member



Dabei seit:
Beiträge: 78

Themenstarter:

beantworten | zitieren | melden

So einen ähnlichen Ansatz hatte ich auch schon und bekam folgenden Fehler:
Fehler
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."
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15510
Herkunft: BW

beantworten | zitieren | melden

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
    }
}
Attachments
private Nachricht | Beiträge des Benutzers