👏
System.Text.Jsonでインターフェース用の汎用コンバーターを作る
はじめに
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