Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht
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?

Gelöst von Whiz-zarD

Zur Lösung
  • Autor
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.

  • Lösung

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

 

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 !

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. 🙃

  • 2 Monate später...
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

 

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.