📄

【.NET 5, F#】System.Text.Json 基礎

2021/09/19に公開

System.Text.Json

.NET で JSON を扱うための標準ライブラリです。
JSON 文字列と .NET のコレクション型の相互変換を行う仕組みを提供します。

https://docs.microsoft.com/ja-jp/dotnet/api/system.text.json

この記事の目的

System.Text.Json を C# から使用する方法は公式のページなど充実しています。
この記事は、それらの情報を F# に利用するための補足となるように意識しています。

この記事の構成

  1. コレクション型について
  2. 各方向の変換メソッドの記述方法
  3. 対応する、型・コレクション・JSON の一覧

コレクション型

F# 6 (.NET 6) にて対応しました🎉[1]

System.Text.Json は標準だと F# 特有のコレクション型に対応していません[2]
特別な理由がなければ下記の .NET と共通の型を使用するのが良さそうです。

{} → record
[] → array

コレクション → JSON

実行部分
System.Text.Json.JsonSerializer.Serialize<📝型>(📝コレクション)
パスカルケース → キャメルケース
System.Text.Json.JsonSerializer.Serialize<📝型>(
    📝コレクション,
    System.Text.Json.JsonSerializerOptions(PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase)
)

JSON → コレクション

実行部分
System.Text.Json.JsonSerializer.Deserialize<📝型>(📝JSON)
キャメルケース → パスカルケース
System.Text.Json.JsonSerializer.Deserialize<📝型>(
    📝JSON,
    System.Text.Json.JsonSerializerOptions(PropertyNameCaseInsensitive = true)
)

object

type JsonX = {n: int}
コレクション
{ n = 10 }
JSON
{"n":10}

object#object

型 (1)
type JsonXObj = {n: int}
type JsonX = {obj: JsonXObj}
コレクション (1)
{ obj = { n = 20 } }

object の入れ子は匿名レコードでも表現できます。

型 (2)
type JsonX = {obj: {|n: int|}}
コレクション (2)
{ obj = {| n = 20 |} }
JSON
{"obj":{"n":20}}

array

type JsonX = {ary: array<int>}
コレクション
{ ary = [| 10; 20 |] }
JSON
{"ary":[10,20]}

プロパティ名の制御

type JsonX = {[<System.Text.Json.Serialization.JsonPropertyName("x-n")>] XN: int}
コレクション
{ XN = 30 }
JSON
{"x-n":30}

end

脚注
  1. https://devblogs.microsoft.com/dotnet/whats-new-in-fsharp-6/#system-text-json-support-for-common-f-types ↩︎

  2. https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/system-text-json-supported-collection-types ↩︎

GitHubで編集を提案

Discussion