.NET7のJSONシリアライザ

.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" } }

大した変更ではないが、結構ありがたい。

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください