Próbuję dodać dane do pliku Json w ten sposób, ale mam błąd:

using System.Text.Json;

void addToJson(int myData)
{
   var data = JsonSerializer.Deserialize<scoreList>(File.ReadAllText("scoreData.json"));

   data.scores.Add(myData);

   var jsonString = JsonSerializer.Serialize<scoreList>(data);
   File.WriteAllText("scoreData.json", jsonString);
}

Myślę, że mój kod jest dobry, po prostu mam błąd pod adresem: data.scores.Add (myData);

A oto moja klasa:

class scoreTest
    {
        public int score { get; set; }
    }

class scoreList
    {
        public List<scoreTest> scores { get; set; }
    }
0
Galileoomega 3 kwiecień 2020, 12:24

3 odpowiedzi

Najlepsza odpowiedź

Nie ma nic związanego z JSON, należy dodać odpowiednią wartość do listy

void addToJson(int myData)
{
    //...
    data.scores.Add(new scoreTest { score = myData });
    //...
}

scores ma typ List<scoreTest>, nie możesz po prostu dodać wartości int do listy, powinieneś najpierw utworzyć instancję scoreTest z wartością score ustawioną na { {X5}}

1
Pavel Anikhouski 6 kwiecień 2020, 12:49

W porządku, jeśli wszystkie typy członków są prymitywne, ale jeśli nie. Może być konieczne utworzenie konstruktora dla członka. Pomoże to uniknąć wyjątku nullreference podczas deserializacji.


class scoreList { 
    public List<scoreTest> scores { get; set; } 

    //We need default constructor for initialize class member.
    public scoreList(){
        this.scores = new List<scoreTest>();
    }
}
1
jornathan 3 kwiecień 2020, 09:45

Aby obsłużyć zagnieżdżoną deserializację / serializację, użyj:

    new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All    
    };

Spróbuj tego:

void addToJson(int myData)
{
    var settings =  new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All    
    }; 
    var data = JsonSerializer.Deserialize<scoreList>(File.ReadAllText("scoreData.json"), settings);

    data.scores.Add(myData);

    var jsonString = JsonSerializer.Serialize<scoreList>(data, settings);
    File.WriteAllText("scoreData.json", jsonString);
}
0
OxQ 3 kwiecień 2020, 09:36