👏

System.Text.Jsonでインターフェース用の汎用コンバーターを作る

2021/05/07に公開

はじめに

System.Text.Jsonで、つぎのようなインターフェイスを実装したクラスをシリアライズ・デシリアライズする、汎用的なコンバーターの作成方法を紹介します。

public interface IEmployee
{
    int EmployeeId { get; }
}

public class Employee : IEmployee
{
    public Employee(int employeeId)
    {
        EmployeeId = employeeId;
    }

    public int EmployeeId { get; }
}

とはいっても、シリアライズはそのままできちゃいますので、メインはデシリアライズです。

コンバーターの実装

System.Text.Json.Serialization.JsonConverterのカスタム実装を用意します。

public class InterfaceConverter<TInterface, TImplement>
    : JsonConverter<TInterface> where TImplement : TInterface
{
    public override TInterface Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options)
    {
        return (TInterface)JsonSerializer.Deserialize(ref reader, typeof(TImplement), options);
    }

    public override void Write(
        Utf8JsonWriter writer,
        TInterface value,
        JsonSerializerOptions options)
    {
        JsonSerializer.Serialize(writer, value, typeof(TImplement), options);
    }
}

コンバーターを使う

こんな感じで使います。

var employee = (IEmployee)new Employee(100);

var options = new JsonSerializerOptions
{
    Converters =
    {
        new InterfaceConverter<IEmployee, Employee>()
    }
};

var employeeString = JsonSerializer.Serialize(employee, options);
Console.WriteLine(employeeString);
var deserializedUnit = JsonSerializer.Deserialize<IEmployee>(employeeString, options);

以上!

Discussion