こんにちは!
前回の記事では、.NET 8 における標準ライブラリ System.Text.Json を使って、VB.NETでオブジェクトをJSON文字列にシリアライズする方法をご紹介しました。
今日はその逆!
「JSON文字列をVB.NETのオブジェクトに変換する方法」=デシリアライズについて、詳しく解説していきたいと思います!
たとえばWeb APIから受け取ったJSONレスポンスを、自分のアプリケーションで扱いやすい形にしたいとき。
そんなときに役立つのが、JsonSerializer.Deserialize(Of T) メソッドです。
基本のデシリアライズ:JSONをオブジェクトに変換する
まずは、基本の Person クラスを用意します。
Public Class Person
Public Property Id As Integer
Public Property Name As String
End Classそして、対応するJSON文字列がこちら。
{"Id":1,"Name":"Taro"}これをVB.NETでデシリアライズしてみましょう。
Imports System.Text.Json
Dim json As String = "{\"Id\":1,\"Name\":\"Taro\"}"
Dim person As Person = JsonSerializer.Deserialize(Of Person)(json)
Console.WriteLine($"{person?.Id}, {person?.Name}")出力結果:
1, Taro
すごく簡単ですね。
クラスとJSONの形さえ合っていれば、あっという間にオブジェクトに変換できます!
プロパティ名が小文字(camelCase)のJSONをデシリアライズする
JavaScriptでは、よくプロパティ名が小文字(camelCase)になっていることがあります。
例えばこんなJSON。
{"id":2,"name":"Jiro"}でも、VB.NETのクラス側では Id、Name とPascalCaseで書いているので、そのままだとマッピングされません。
こんなときは、JsonSerializerOptions を使って「大文字小文字を無視する」設定をします!
Dim options As New JsonSerializerOptions With {
.PropertyNameCaseInsensitive = True
}
Dim json As String = "{\"id\":2,\"name\":\"Jiro\"}"
Dim person As Person = JsonSerializer.Deserialize(Of Person)(json, options)
Console.WriteLine($"{person?.Id}, {person?.Name}")出力結果:
2, Jiro
これならcamelCaseでも気にせず使えますね。
配列のデシリアライズ
複数の Person オブジェクトが入ったJSON配列も、もちろんデシリアライズできます!
こんなJSONを用意してみましょう。
[
{"Id":1,"Name":"Taro"},
{"Id":2,"Name":"Jiro"}
]コードはこうなります。
Dim jsonArray As String = "[{\"Id\":1,\"Name\":\"Taro\"},{\"Id\":2,\"Name\":\"Jiro\"}]"
Dim people As Person() = JsonSerializer.Deserialize(Of Person())(jsonArray)
For Each p In people
Console.WriteLine($"{p.Id}, {p.Name}")
Next出力結果:
1, Taro 2, Jiro
もちろん、配列だけでなく List(Of Person) にもできます!
Dim peopleList As List(Of Person) = JsonSerializer.Deserialize(Of List(Of Person))(jsonArray)
柔軟ですね。
ネストされたオブジェクトのデシリアライズ
次は、オブジェクトの中に配列がある、ちょっと複雑なJSONにチャレンジしてみます!
{
"GroupId": 1,
"People": [
{ "Id": 1, "Name": "Taro" },
{ "Id": 2, "Name": "Jiro" }
]
}これに対応するクラスはこんな感じです。
Public Class Group
Public Property GroupId As Integer
Public Property People As Person()
End Classデシリアライズしてみましょう。
Dim json As String = "
{
""GroupId"": 1,
""People"": [
{ ""Id"": 1, ""Name"": ""Taro"" },
{ ""Id"": 2, ""Name"": ""Jiro"" }
]
}"
Dim group As Group = JsonSerializer.Deserialize(Of Group)(json)
Console.WriteLine($"Group ID: {group?.GroupId}")
For Each p In group?.People
Console.WriteLine($"- {p.Id}, {p.Name}")
Next出力結果:
Group ID: 1 - 1, Taro - 2, Jiro
入れ子になったデータも、きちんとクラス構造を合わせれば問題なく扱えます!
JsonPropertyName属性を使ったマッピング
プロパティ名を自由にマッピングしたいときは、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すると、JSONがこんな感じでも…
{"id":3,"name":"Saburo"}デシリアライズできちゃいます!
Dim json As String = "{\"id\":3,\"name\":\"Saburo\"}"
Dim person As Person = JsonSerializer.Deserialize(Of Person)(json)
Console.WriteLine($"{person?.Id}, {person?.Name}")便利すぎますね。
デシリアライズの失敗と例外処理
もしJSONの形式が間違っていたら?
そんなときは JsonException が発生します。
例えば、こんな無茶なJSON。
Dim invalidJson As String = "{\"Id\": \"NotAnInt\", \"Name\": \"Taro\"}"
Try
Dim person As Person = JsonSerializer.Deserialize(Of Person)(invalidJson)
Catch ex As JsonException
Console.WriteLine("デシリアライズに失敗しました: " & ex.Message)
End Tryデシリアライズはわりと失敗しやすいので、Try-Catch でしっかりエラーハンドリングしておくと安心です!
nullの扱いに注意
Deserialize(Of T) は、うまくいかなかったときに Nothing を返すこともあります。
なので、使うときは必ず nullチェック(Nothingチェック)を入れるクセをつけておきましょう。
パフォーマンスとセキュリティの注意点
- デシリアライズするJSONは「信頼できるデータ」だけにしましょう。
- System.Text.Jsonは高速ですが、特殊なケース(型推論が必要なポリモーフィズムなど)には弱いです。
- 外部から受け取ったJSONをそのままデシリアライズするのはちょっと危ない場面もあります。ちゃんとバリデーションしましょう。
まとめ
.NET 8の標準ライブラリ System.Text.Json を使えば、VB.NETでも簡単にJSONをデシリアライズできます!
JsonSerializer.Deserialize(Of T)で手軽にオブジェクト生成- camelCaseにも
JsonSerializerOptionsやJsonPropertyName属性で柔軟に対応 - 配列もネスト構造も問題なし
- 例外処理とnullチェックは忘れずに!
標準機能だけでここまでできるなんて、本当に便利な時代ですね。
ぜひあなたのアプリにも、System.Text.Jsonをガンガン活用していきましょう!
