【VB.NET/.NET8】System.Text.JsonでオブジェクトをJSONにシリアライズする方法

こんにちは!

今日は、VB.NETで【System.Text.Json】を使ってオブジェクトをJSONにシリアライズする方法について詳しく書きたいと思います。

かつてC#ではJSONのシリアライズといえば「Newtonsoft.Json(Json.NET)」が定番でしたよね。多くのプロジェクトで標準のように使われていました。しかし、.NET Core 3.0以降、そして現在の.NET 8では、Microsoft公式の【System.Text.Json】が標準ライブラリとして利用できるようになりました。追加のNuGetパッケージも不要で、しかも軽量&高速というメリットもあります!

この記事では、VB.NETでの基本的な使い方から、プロパティ名のカスタマイズ、配列やネストされたオブジェクトのシリアライズ、さらには便利な設定オプションまで、順番にわかりやすく解説していきますね。


基本のシリアライズ:クラスをJSONに変換する

まずはとてもシンプルなクラスを用意してみましょう。

Public Class Person
    Public Property Id As Integer
    Public Property Name As String
End Class

この Person クラスには IdName の2つのプロパティがあります。
では、これをインスタンス化してJSONに変換してみます。

Imports System.Text.Json

Dim p1 As New Person With {
    .Id = 1,
    .Name = "Taro"
}

Dim jsonP1 As String = JsonSerializer.Serialize(p1)
Console.WriteLine(jsonP1)

出力されるJSONはこんな感じになります:

{"Id":1,"Name":"Taro"}

たったこれだけで、オブジェクトがJSON文字列に変換できました。とても簡単ですよね!


プロパティ名をカスタマイズする:小文字に変えたい場合

JavaScriptと連携する場合など、JSONのプロパティ名を小文字にしたい場面って意外と多いですよね。
そんなときには【JsonPropertyName】属性を使って柔軟に対応できます。

クラスを次のように書き換えます。

Imports System.Text.Json.Serialization

Public Class Person
    <JsonPropertyName("id")>
    Public Property Id As Integer

    <JsonPropertyName("name")>
    Public Property Name As String
End Class

これで、プロパティごとに任意の名前を指定できます。

実際にシリアライズしてみましょう。

Dim p4 As New Person With {
    .Id = 4,
    .Name = "Shiro"
}

Dim jsonP4 As String = JsonSerializer.Serialize(p4)
Console.WriteLine(jsonP4)

出力はこうなります。

{"id":4,"name":"Shiro"}

C#のPascalCase(先頭大文字)ではなく、JSONのcamelCase(先頭小文字)にきれいに変換できましたね!


配列のシリアライズ

次に、複数の Person インスタンスを配列にしてシリアライズしてみましょう。

Dim p2 As New Person With {
    .Id = 2,
    .Name = "Jiro"
}

Dim people As Person() = {p1, p2}

Dim jsonArray As String = JsonSerializer.Serialize(people)
Console.WriteLine(jsonArray)

出力結果はこちらです。

[{"Id":1,"Name":"Taro"},{"Id":2,"Name":"Jiro"}]

配列やリストをそのまま渡すだけで、きちんとJSONの配列形式にシリアライズされます。とても便利ですね!


ネストされたオブジェクトのシリアライズ

もちろん、オブジェクトの中にさらにオブジェクトや配列を含めるケースにも対応できます。

例えば、Group というクラスを用意して、その中に Person 配列を持たせるとしましょう。

Public Class Group
    Public Property GroupId As Integer
    Public Property People As Person()
End Class

インスタンスを作成してシリアライズしてみます。

Dim group As New Group With {
    .GroupId = 1,
    .People = {p1, p2}
}

Dim jsonGroup As String = JsonSerializer.Serialize(group)
Console.WriteLine(jsonGroup)

出力結果:

{"GroupId":1,"People":[{"Id":1,"Name":"Taro"},{"Id":2,"Name":"Jiro"}]}

ネストされた構造も自然に扱えるので、実践的な場面でも安心して使えます。

もしここでもプロパティ名をカスタマイズしたい場合は、先ほどと同じように [JsonPropertyName] を使えば柔軟にコントロールできます!


その他の便利な設定オプション

さらに便利な機能として、【JsonSerializerOptions】を使う方法があります。

例えば、すべてのプロパティ名を自動でcamelCaseに変換したいときは、こんな感じです。

Dim options As New JsonSerializerOptions With {
    .PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    .WriteIndented = True ' 見やすく整形出力
}

Dim jsonIndented As String = JsonSerializer.Serialize(p1, options)
Console.WriteLine(jsonIndented)

出力はこうなります。

{
  "id": 1,
  "name": "Taro"
}

このように、クラスを修正せずとも、オプションだけで出力形式を変えられるのは大きなメリットですよね!


Newtonsoft.Jsonとの違い

比較表でサクッと違いをまとめてみました。

機能Newtonsoft.JsonSystem.Text.Json
標準ライブラリ✕(NuGet必要)〇(標準搭載)
パフォーマンス普通高速
カスタマイズ性非常に高いだんだん充実中
JSON Schema対応
循環参照検出〇(例外で検出)

特に.NET 8を使っている場合は、【System.Text.Json】を積極的に使っていくほうが、軽量な構成になってパフォーマンス面でもメリットが大きいですよ!


まとめ

  • VB.NETでも、System.Text.Json を使えば非常に簡単にシリアライズできる。
  • JsonSerializer.Serialize を呼び出すだけで、オブジェクトがJSON文字列になる。
  • [JsonPropertyName] 属性を使えば、プロパティ名を自由にカスタマイズできる。
  • 配列やネストされたオブジェクトにも対応している。
  • JsonSerializerOptions を使うことで、さらに細かく設定をカスタマイズできる。

外部ライブラリに依存せず、標準機能でサクッとJSON処理ができるのは、保守性や移植性を考える上でもとても大きなポイントです。

これからのVB.NET開発では、【System.Text.Json】を積極的に活用していきましょう!


ここまで読んでいただきありがとうございました!