スキップしてメイン コンテンツに移動

JsonSerializerでシリアライズしたい

System.Text.JsonのJsonConverter

事の始まり

意外と何もしなくてもシリアライズ・デシリアライズ出来てしまうので、わざわざConverterを用意する機会がなかったりもする。

ただ、たまにException!とか言ってくるのでそんなときはJsonCoverterを書いてあげる必要がある。昔のStack Overflowを見ていると諦めて文字列でシリアライズしろよとかあって、チビリそうになるけど、今はJsonConverterがあるのよ。

https://learn.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json/converters-how-to?pivots=dotnet-7-0

FontFamilyでコケたので確認してみるとTypeConverterとかはあったりするので、string<->class変換は出来るけど、JsonConverterが設定されていないとJsonSerializorでは変換してくれないみたい。

サンプル

とりあえず簡単にJsonConverterを書いてみた。

public class FontFamilyJsonConverter : JsonConverter<Fontfamily>
{
    public override FontFamily Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    => new (reader.GetString());

    public override void Write(Utf8JsonWriter writer, FontFamily value, JsonSerializerOptions options)
    => writer.WriteStringValue(value.Source);
}

例外処理とかはないので自分でシリアライズ・デシリアライズするのが前提だけど、とりあえずは動く…と思う(私の環境だとWriteしか呼ばれてないので…)。

JsonConverterを知らないときは例外が発生するプロパティを[JsonIgnore]属性で対象外にし、別途シリアライズ・デシリアライズ用のプロパティを用意しようとしていたのですが、そんな必要はありませんでした。

使い方

使い方は以下の3つがある。
  1. JsonSerializerOptionsのCovertersに設定する
  2. プロパティに[JsonConverter]属性を設定する
  3. 型に[JsonConverter]属性を設定する
今回はすでにある型だったのと都度設定するのが面倒だったので2の方法にした。
[JsonConverter(typeof(FontFamilyJsonConverter))]
public FontFamily FontFamily { get => _fontFamily; set => SetProperty(ref _fontFamily, value); }
優先順位的には2 > 1 > 3みたいなので、後から変更できるようにしたいならプロパティには設定せずにJsonSerialiserOptionsに設定することになると思う。

コメント

このブログの人気の投稿

KoeMill V.0.9.0.0 リリース

KoeMillのV.0.9.0.0をリリース KoeMillは、音声認識による文字起こしを行うソフトウェアです。音声認識モデルにはWhisperが採用されており動画や音声から自動的に高品質な文字起こしができるため、煩雑な手作業を省くことができます。 オフラインで動作するため、ネットワークの遅延などによる遅れやプライバシーに関する懸念もありません。また、GPUを利用することで高速な処理を実現します。 ダウンロードページ

CapCap V.0.9.2.7 リリース

CapCapのV.0.9.2.7をリリース 主な変更内容 HTTP POST設定でヘッダの設定に対応 HTTP POST設定でJSONのオブジェクトおよび配列に対応 HTTP POST設定を大項目ごとに折りたためる機能に対応 サンプルプリセット(ChatGPT API)を追加 プリセット複製時に複製先の変更が複製元に及んでいた不具合を修正 HTTP POST設定 新たにリクエストヘッダを設定できるようになりました。これによりAuthorizationによる認証などヘッダが必要なAPIにも対応できるようになりました。合わせて、これまで設定することが出来なかったJSON ObjectおよびArrayについても設定できるようになりました。 ChatGPT APIについて サンプルプリセットを追加しました。HTTP POSTのヘッダおよびJSON ArrayとObjectに対応したため、その対応例となります。 継続的に使おうとすると費用が発生することになるので、無料枠が残っている間に遊んでもらえると幸いです。 DLページ: Home

CapCap V0.9.2.5 リリース

CapCapのV0.9.2.5をリリース 主な変更内容 段落検出機能を追加 字幕モードの名称を変更(Readability -> Text, Layout -> Item) 段落検出 テキストの行同士の距離をもとに段落を検出することが出来るようになりました。 段落の検出および段落間への空行挿入が行なえます。 これまではテキストをひと繋がりの文章として認識していましたが、段落ごとに分離されることで可読性の向上が見込めます。 文章に対して段落が多い場合や段落が2行からなる場合などには精度が落ちる傾向にあります。また実験的機能の側面があるため問題点等あればご報告いただけると助かります。 DLページ: Home