Ts61 Geschrieben 2. Februar 2022 Geschrieben 2. Februar 2022 Program.cs using ConfigTest; using Newtonsoft.Json; var configString = File.ReadAllText("config.json"); var config = JsonConvert.DeserializeObject<Config>(configString); Console.WriteLine(config.GetType()); Console.WriteLine(config.ExportFormat.GetType()); Config.json { "Irgendwas": 123, "ExportFormat": { "$type": "ConfigTest.FlfFormat, ConfigTest", "FileName": "export1.dat", "Columns": "name,datum,miregal", "Lengths": "20,8,50" } } Config.cs namespace ConfigTest { public class Config { public BaseExportFormat ExportFormat { get; set; } //public FlfFormat ExportFormat { get; set; } public string Irgendwas { get; set; } } } ExportFormat.cs namespace ConfigTest { public abstract class BaseExportFormat { public string FileName { get; set; } } } FlfFormat.cs namespace ConfigTest { public class FlfFormat:BaseExportFormat { public string Columns { get; set; } public string Lengths { get; set; } } } CsvFormat.cs namespace ConfigTest { public class CsvFormat : BaseExportFormat { public string Columns { get; set; } } } Hi, wie kann ich über config.Json Datei verhindern das er auf einen Fehler läuft? Zitieren
1 Whiz-zarD Geschrieben 2. Februar 2022 Geschrieben 2. Februar 2022 Das Type Name Handling fehlt. Die DeserializeObject()-Methode hat noch eine weitere Signatur, womit man eine Konfiguration mitgeben kann. In dieser Konfiguration muss man dann mitgeben, dass er das Type Name Handling aktivieren soll: var config = JsonConvert.DeserializeObject<Config>(configString, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects }); Erst dann erzeugt er das gewünschte Objekt. https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm Ts61 reagierte darauf 1 Zitieren
0 Whiz-zarD Geschrieben 2. Februar 2022 Geschrieben 2. Februar 2022 Präzisiere deine Frage. Welche Fehler? Zitieren
0 Ts61 Geschrieben 2. Februar 2022 Autor Geschrieben 2. Februar 2022 vor 18 Minuten schrieb Ts61: Config.cs namespace ConfigTest { public class Config { public BaseExportFormat ExportFormat { get; set; } //public FlfFormat ExportFormat { get; set; } public string Irgendwas { get; set; } } } Der BaseExportformater ist eine abstrakte klasse von der hängen die klassen Csv..., Flf... ab. Sobald ich in der Config.cs Baseexporter rufe gibt er mir ein null zurück. Ich würde in der Config.Json das so ändern das er je nach dem welche klasse werte hat diese nimmt. Zitieren
0 Gast Geschrieben 4. Februar 2022 Geschrieben 4. Februar 2022 Also erster Schritt wäre überhaupt eine Json-Datei Deserialisieren und wieder Serialisieren zu können. Ich hätte mich da an die Newtonsoft-Doku gehalten. Das erste Problem ist du gibst den Pfad falsch an. Ich denke du hast schon dort den Fehler System.IO.FileNotFoundException bekommen (Deswegen fragt Whiz welcher Fehler überhaupt). Zitat var configString = File.ReadAllText(@"c:\config.json"); Dann weiterhin ist dein Daten-Model und selbst der Aufbau der JSON-Datei kacke. Hier ich hab das für dich gefixt: Zitat DateiDatenModel config = JsonConvert.DeserializeObject<DateiDatenModel>(configString); Zitat public class ExportFormat { [JsonConstructor] public ExportFormat( [JsonProperty("$type")] List<string> type, [JsonProperty("FileName")] string fileName, [JsonProperty("Columns")] List<string> columns, [JsonProperty("Lengths")] List<string> lengths ) { this.Type = type; this.FileName = fileName; this.Columns = columns; this.Lengths = lengths; } [JsonProperty("$type")] public IReadOnlyList<string> Type { get; } [JsonProperty("FileName")] public string FileName { get; } [JsonProperty("Columns")] public IReadOnlyList<string> Columns { get; } [JsonProperty("Lengths")] public IReadOnlyList<string> Lengths { get; } } public class DateiDatenModel { [JsonConstructor] public DateiDatenModel( [JsonProperty("Irgendwas")] int irgendwas, [JsonProperty("ExportFormat")] ExportFormat exportFormat ) { this.Irgendwas = irgendwas; this.ExportFormat = exportFormat; } [JsonProperty("Irgendwas")] public int Irgendwas { get; } [JsonProperty("ExportFormat")] public ExportFormat ExportFormat { get; } } Zitat { "Irgendwas": 123, "ExportFormat": { "$type": ["ConfigTest.FlfFormat, ConfigTest"], "FileName": "export1.dat", "Columns": ["name,datum,miregal"], "Lengths": ["20,8,50"] } } Damit sollte das Deserialisieren und Serialisieren deiner Json-Datei klappen. Um das Ganze noch ins CSV-Format zu serialisieren musst du eigene Funktionen schreiben. Aber bis dahin erstmal die basics richtig hinbekommen. Viel Spaß noch ! Zitieren
0 Gast Geschrieben 4. Februar 2022 Geschrieben 4. Februar 2022 Nochn Tip: Wenn du schon Newtonsoft.Json als NuGet benutzst kannst du auch CsvHelper für die Umwandlung in CSV nutzen. Das reduziert die Eigenprogrammierung und Kopfschmerzen erheblich. 🙃 Zitieren
0 KeeperOfCoffee Geschrieben 4. Februar 2022 Geschrieben 4. Februar 2022 Nur mal so am Rande: NewtonSoft wird eigentlich nur noch maintained und ned mehr weiterentwickelt. Der "Hauptentwickler" unterstützt Microsofts "System.Text.Json". System.Text.Json is defacto jetzt Standard. Zitieren
0 Ts61 Geschrieben 4. Februar 2022 Autor Geschrieben 4. Februar 2022 Danke an jeden von euch !! Zitieren
0 DevcouchPodcast Geschrieben 13. April 2022 Geschrieben 13. April 2022 Am 4.2.2022 um 08:58 schrieb KeeperOfCoffee: Nur mal so am Rande: NewtonSoft wird eigentlich nur noch maintained und ned mehr weiterentwickelt. Der "Hauptentwickler" unterstützt Microsofts "System.Text.Json". System.Text.Json is defacto jetzt Standard. Das ist nicht richtig. Das Produkt heißt Json.Net, der Hersteller Newtonsoft und wird aktiv weiter entwickelt. Wir haben vor ca. 3 Wochen eine neue Major-Version veröffentlicht, siehe: https://github.com/JamesNK/Newtonsoft.Json/releases Die Microsoft-Json Implementierung ist nicht Feature-Complete und hat z.B. keinen Patch Support. Microsoft selbst empfiehlt dafür Json.Net ,siehe z.B.: https://docs.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-6.0 Hier gibts eine Auflistung mit Features, die von Microsoft Json nicht supported werden: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to?pivots=dotnet-6-0#table-of-differences-between-newtonsoftjson-and-systemtextjson Gruß, Manu Zitieren
Frage
Ts61
Hi, wie kann ich über config.Json Datei verhindern das er auf einen Fehler läuft?
8 Antworten auf diese Frage
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.