Zum Inhalt springen
  • 0

JSON Newtonsoft


Frage

Geschrieben
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?

8 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben

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

 

  • 0
Geschrieben
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.

  • 0
Geschrieben

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 !

  • 0
Geschrieben

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

  • 0
Geschrieben
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

 

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.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...