Gå til indholdet

N239 Egenskab (serialisering)

Skab en fil på disken (feks c:\temp\data.json) med følgende indhold:

[
  {
    "Id": 1,
    "Navn": "A",
    "ErDansk": true,
    "Dato": "1966-01-01T00:00:00"
  },
  {
    "Id": 2,
    "Navn": "B",
    "ErDansk": true,
    "Dato": "2003-01-01T00:00:00"
  },
  {
    "Id": 3,
    "Navn": "C",
    "ErDansk": true,
    "Dato": "1988-01-01T00:00:00"
  }
]

Det er en liste af personer med fire egenskaber.

Warning

Pas på den ikke kommer til at hedde data.json.txt hvis den dannes gennem Stifinderen.

Din opgave er at skabe en klasse Person med de fire egenskaber (skal hedde det samme som i filen), og herefter skabe en liste af personer ved hjælp af JSON deserialisering. Du kan benytte den indbyggede System.Text.Json.Deserialize<> som følger:

// hent json
string json = System.IO.File.ReadAllText(@"c:\temp\data.json");
// deserialiser
List<Person> lst = System.Text.Json.JsonSerializer.Deserialize<List<Person>>(json);

Herefter skal du løbe listen igennem og udskrive Navn eller lign.

Ekstra

Prøv evt at udvide JSON filen med en ny egenskab på hver person, og tilrette klassen så den tager hensyn til det nye skema.

Ekstra Ekstra:

Prøv at tilføje følgende kode til sidst i main (og sørg for at klassen Person er public):

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(List<Person>));
System.IO.TextWriter writer = new System.IO.StreamWriter(@"c:\temp\data.xml");
x.Serialize(writer, lst);

Check om der er kommet en xml-fil på disken med det rette indhold.

Ekstra Ekstra Ekstra

Prøv at tilføje NuGet-pakken ServiceStack.Text og tilføj følgende kode i bunden af main:

// Bare for sjov - brug ServiceStack.Text (NuGet) til at gemme som CSV            
ServiceStack.Text.CsvConfig.ItemSeperatorString = ";";  // Dansk format
System.IO.File.WriteAllText(@"c:\temp\data.csv", ServiceStack.Text.CsvSerializer.SerializeToString(lst));

Check om der er kommet en csv-fil på disken med det rette indhold.

Klik for at se et forslag til en løsning
using System;
using System.Collections.Generic;
namespace Demo
{
    internal class Program
    {
        static void Main(string[] args)
        {

            string json = System.IO.File.ReadAllText(@"c:\temp\data.json");
            List<Person> lst = System.Text.Json.JsonSerializer.Deserialize<List<Person>>(json);
            foreach (var item in lst)
                Console.WriteLine(item.Navn);

            // Bare for sjov - gem som xml
            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(List<Person>));
            System.IO.TextWriter writer = new System.IO.StreamWriter(@"c:\temp\data.xml");
            x.Serialize(writer, lst);

            // Bare for sjov - brug ServiceStack.Text (NuGet) til at gemme som CSV            
            ServiceStack.Text.CsvConfig.ItemSeperatorString = ";";  // Dansk format
            System.IO.File.WriteAllText(@"c:\temp\data.csv", ServiceStack.Text.CsvSerializer.SerializeToString(lst));
        }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Navn { get; set; }
        public bool ErDansk { get; set; }
        public DateTime Dato { get; set; }
    }

}