.NET7になって、JSONシリアライザがアップデートされ、今までサポートしていなかったDateOnly型やTimeOnly形の変換を行ってくれるようになった。
.NET6と.NET7を比べると以下のよう感じ。(dotnet-scriptで実行)
using System.Text.Json;
public class Person {
public string Name { get; set; }
public DateOnly Birthday { get; set; }
}
List<Person> plst = new();
Person p = new() { Name="T.Sumomo", Birthday=new DateOnly(1964,2,3)};
plst.Add(p);
p = new() { Name="J.Sumomo", Birthday=new DateOnly(1988,5,13)};
plst.Add(p);
string json = JsonSerializer.Serialize(plst);
json
結果(.NET6)
System.NotSupportedException: System.NotSupportedException: Serialization and deserialization of 'System.DateOnly' instances are not supported. Path: $.Birthday.
+ System.Text.Json.ThrowHelper.ThrowNotSupportedException(ref System.Text.Json.WriteStack, System.NotSupportedException)
+ JsonConverter<T>.WriteCore(System.Text.Json.Utf8JsonWriter, ref T, System.Text.Json.JsonSerializerOptions, ref System.Text.Json.WriteStack)
+ System.Text.Json.JsonSerializer.WriteUsingSerializer<TValue>(System.Text.Json.Utf8JsonWriter, ref TValue, System.Text.Json.Serialization.Metadata.JsonTypeInfo)
+ System.Text.Json.JsonSerializer.WriteStringUsingSerializer<TValue>(ref TValue, System.Text.Json.Serialization.Metadata.JsonTypeInfo)
+ System.Text.Json.JsonSerializer.Serialize<TValue>(TValue, System.Text.Json.JsonSerializerOptions)
DateOnlyのシリアライズ・デシリアライズをサポートしていないので、エラー
結果(.NET7)
"[{\"Name\":\"T.Sumomo\",\"Birthday\":\"1964-02-03\"},{\"Name\":\"J.Sumomo\",\"Birthday\":\"1988-11-23\"}]"
DateOnlyのシリアライズ・デシリアライズをサポートしたので、正常にJSONにシリアライズされる。
もちろん、デシリアライズもOK
var xlst = JsonSerializer.Deserialize<List<Person>>(json);
xlst
結果
List<Submission#1.Person>(2) { Submission#1.Person { Birthday=[1964/02/03], Name="T.Sumomo" }, Submission#1.Person { Birthday=[1988/11/23], Name="J.Sumomo" } }
大した変更ではないが、結構ありがたい。