Laden...

Werte werden bei Serialisierung nicht gesetzt

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 387 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
Werte werden bei Serialisierung nicht gesetzt

Hallo allerseits,
im folgenden Programm ist das Array immer leer.


using System;
using System.IO;
using System.Text.Json;
using System.Windows.Forms;

namespace test123
{
    public partial class Form1 : Form
    {
        Song[] Songs;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string jsonString = File.ReadAllText(@"C:\users\kstan\source\LED\testextension.txt");
            Songs = JsonSerializer.Deserialize<Song[]>(jsonString);
            for (int loop = 0; loop < Songs.Length; loop++)
            {
                MessageBox.Show(Songs[loop].VTitle);
            }

        }

        [Serializable]
        public class Song
        {
            public string VRelease { get; set; }
            public string VTrack { get; set; }
            public string VTitle { get; set; }
            public string VArtist { get; set; }
            public string VAlbum { get; set; }

            public Song(string vRelease, string vTrack, string vTitle, string vArtist, string vAlbum)
            {
                VRelease = vRelease;
                VTrack = vTrack;
                VTitle = vTitle;
                VArtist = vArtist;
                VAlbum = vAlbum;
            }

            public Song()
            {
            }
        }
    }
}


Nach dem einlesen mit File.Read steht in jsonString ein sauberer Json String. Songs.Length ist in meinem Fall 7. Trotzdem zeigt die MessageBox immer leer an.
Die Json-Datei ist


[
  {
    "ReleaseDate": "22.11.1968",
    "Track": "29",
    "Title": "Revolution 9",
    "Artist": "Beatles",
    "Album": "The Beatles White Album"
  },
  {
    "ReleaseDate": "1960",
    "Track": "6",
    "Title": "Fools Rush In",
    "Artist": "Frank Sinatra",
    "Album": "Nice N Easy"
  },
  {
    "ReleaseDate": "11.11.1971",
    "Track": "1",
    "Title": "One of These Days",
    "Artist": "Pink Floyd",
    "Album": "Meddle"
  },
  {
    "ReleaseDate": "1988",
    "Track": "7",
    "Title": "Where Is My Mind?",
    "Artist": "Pixies",
    "Album": "Surfer Rosa"
  },
  {
    "ReleaseDate": "5.1981",
    "Track": "9",
    "Title": "Can't Find My Mind",
    "Artist": "Cramps",
    "Album": "Psychedelic Jungle"
  },
  {
    "ReleaseDate": "10.6.2003",
    "Track": "13",
    "Title": "Scatterbrain. (As Dead As Leaves.)",
    "Artist": "Radiohead",
    "Album": "Hail to the Thief"
  },
  {
    "ReleaseDate": "30.6.1992",
    "Track": "3",
    "Title": "Dress",
    "Artist": "P J Harvey",
    "Album": "Dry"
  }
]

Der Debugger zeigt mit auch, dass die Daten immer Null sind. Warum?
Was ist da falsch?

Karl Stanger
D
152 Beiträge seit 2013
vor einem Jahr

Es wird ein public Standard ctor benötigt, oder der ctor muss gekennzeichnet werden.

Siehe auch https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/immutability?pivots=dotnet-6-0

4.942 Beiträge seit 2008
vor einem Jahr

Die Namen in der Json-Datei passen nicht zu den Eigenschaften (z.B. ReleaseDate <-> VRelease).

Was soll das V überhaupt bei den Eigenschaftsnamen?

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Danke - ich hatte das einfach übersehen.
Das V ist historisch gewachsen. Das kann weg. 😉

Karl Stanger
P
57 Beiträge seit 2017
vor einem Jahr

Grundsätzlich geht es schon was du vorhast, aber wie Th69 schon sagte, stimmen die Properties nicht überein.

Du kannst das "umgehen" wenn du über das jeweilige Property in der Klasse Song eine Annotation setzt:


      [JsonPropertyName("ReleaseDate")]
      public string VRelease { get; set; }

Sauberer wäre es allerdings, wenn die Properties identisch wären.

.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Gut zu wissen - da ich aber erst am Anfang bin und fast nichts umstellen muss, ist es für mich einfach, die Properties identisch zu machen.

Karl Stanger