web-dev-qa-db-ja.com

System.Text.Json.JsonSerializerでクラスフィールドを使用する方法

最近、ソリューションをすべて.NET Core 3にアップグレードしました。クラス変数をフィールドにする必要があるクラスがあります。新しいSystem.Text.Json.JsonSerializerはフィールドのシリアル化も非シリアル化もサポートせず、代わりにプロパティのみを処理するため、これは問題です。

以下の例の2つの最後のクラスが同じ正確な値を持つことを保証する方法はありますか?

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

現在、フィールドはシリアライズ可能ではありません。しかし、開発作業が進行中です。あなたは this thread に従うことができます。

8
pavinan

私がSystem.Text.Jsonの拡張機能として書いたこのライブラリを試してみて、不足している機能を提供してください: https://github.com/dahomey-technologies/Dahomey.Json

フィールドのサポートが見つかります。

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
}