FC2ブログ

記事一覧

JSON形式の文字列データをクラスに変換する方法 -デシリアライズ- | VB.NET


今回は VB.NET で json 形式の文字列に書かれているデータをオリジナルのクラスに変換してデータ保持する方法について覚え書きします。
Json は NuGet パッケージをインストールして簡単に実現可能なソースコードが公開されていますが、不要な DLL を参照することになりますし、何かあった時の為にできるだけ外部 DLL には頼らないほうが良いと考えていますので、今回のコードは全て .Net のマネージコードなので、汎用性が高いものと考えています。


vb_json_01.png


前提条件
Windows 7 professional 以降 / Windows Server 2008 R2 以降
Visual Studio 2010 professional 以降
VB.net
.Net FrameWork 4.0 以降



1.json 文字列の構造

json 形式の文字列には標準的なフィールド名称と型で取得できるように想定しました。

json 文字列
"{
""Id"":""1"",
""Name"":""山田太郎"",
    ""Age"":""20"",
    ""Gender"":""1"",
""
}"



2.ViewModelクラス

json 形式のデータを保持するためのクラスを作成します。
ポイントとしては、変換するオブジェクトのクラス名に DataContract の属性を設定し、プロパティには DataMember 属性を設定します。プロパティの名称はjsonの文字列と全く同じにします。(大文字小文字記号など区別されます)
※プロジェクトの参照設定に System.Runtime.Serialization.dll を追加することが前提です。

Customer.vb
Imports System.Runtime.Serialization
<DataContract()>
Public Class Customer

<DataMember()>
Public Property Id As Integer = 0

<DataMember()>
Public Property Name As String = String.Empty

<DataMember()>
Public Property Age As Integer = 0

<DataMember()>
Public Property Gender As Integer = 0

End Class



3.json ファイルを開く

System.IO.MemoryStream でバイト配列にした json データを開き、DataContractJsonSerializer (シリアライザー)で逆シリアライズしたオブジェクトを取得します。
※プロジェクトの参照設定に System.Runtime.Serialization.dll を追加することが前提です。

JsonUtility.vb
Imports System.Runtime.Serialization.Json
Public Class JsonUtility

''' <summary>
''' json を読み取り、クラスに変換して返す
''' </summary>
''' <typeparam name="T">変換後の型</typeparam>
''' <param name="json">json文字列</param>
''' <returns></returns>
Public Shared Function GetObject(Of T)(ByVal json As String) As T

Dim result As T
Dim tp As Type = GetType(T)
Dim serializer As New DataContractJsonSerializer(tp)

Using stream As New IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(json))
result = DirectCast(serializer.ReadObject(stream), T)
End Using

Return result

End Function

End Class



4.使用方法

以下のように JsonUtility を呼び出し、引数に json 文字列を渡した結果を変数に格納します。

TestForm.vb
Private Sub btnReadJson_Click(sender As Object, e As EventArgs) Handles btnReadXml.Click

Dim json As New Text.StringBuilder()
Dim entity As Customer
json.AppendLine("{")
json.AppendLine("""Id"": ""1"",")
json.AppendLine("""Name"":""山田太郎"",")
json.AppendLine("""Age"":""20"",")
json.AppendLine("""Gender"":""1"",")
json.AppendLine("}")
entity = JsonUtility.GetObject(Of Customer)(json.ToString())
Console.WriteLine(entity.ToString())

End Sub


以上で json 文字列の中のデータをクラスに変換して保持することができます。
次回の記事ではデシリアライズとは真逆で、クラスを JSON 形式の文字列データをに変換する方法(シリアライズ)についてご紹介しています。






最後までお読みいただき、ありがとうございます。
他にも VB.net に関する記事 をご紹介しておりますのでご参考頂ければ幸いです。



関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。