web-dev-qa-db-fra.com

Comment utiliser les champs de classe avec System.Text.Json.JsonSerializer?

J'ai récemment mis à niveau une solution pour qu'elle soit entièrement .NET Core 3 et j'ai une classe qui nécessite que les variables de classe soient des champs. Il s'agit d'un problème car le nouveau System.Text.Json.JsonSerializer ne prend pas en charge la sérialisation ni la désérialisation des champs mais gère uniquement les propriétés à la place.

Existe-t-il un moyen de garantir que les deux classes finales dans l'exemple ci-dessous ont les mêmes valeurs exactes?

using System.Text.Json;

public class Car
{
    public int Year { get; set; } // does serialize correctly
    public string Model; // doesn't serialize correctly
}

static void Problem() {
    Car car = new Car()
    {
        Model = "Fit",
        Year = 2008,
    };
    string json = JsonSerializer.Serialize(car); // {"Year":2008}
    Car carDeserialized = JsonSerializer.Deserialize<Car>(json);

    Console.WriteLine(carDeserialized.Model); // null!
}
11
Theyouthis

Actuellement, les champs ne sont pas sérialisables. Mais il y a un travail de développement en cours. Vous pouvez suivre ce fil .

8
pavinan

Veuillez essayer cette bibliothèque que j'ai écrite comme une extension de System.Text.Json pour offrir les fonctionnalités manquantes: https://github.com/dahomey-technologies/Dahomey.Json .

Vous trouverez un support pour les champs.

using System.Text.Json;
using Dahomey.Json

public class Car
{
    public int Year { get; set; } // does serialize correctly
    public string Model; // will serialize correctly
}

static void Problem() {
    JsonSerializerOptions options = new JsonSerializerOptions();
    options.SetupExtensions(); // extension method to setup Dahomey.Json extensions

    Car car = new Car()
    {
        Model = "Fit",
        Year = 2008,
    };
    string json = JsonSerializer.Serialize(car, options); // {"Year":2008,"Model":"Fit"}
    Car carDeserialized = JsonSerializer.Deserialize<Car>(json);

    Console.WriteLine(carDeserialized.Model); // Fit
}
1