前回紹介した「Cache' eXTreme」(.NET側のクラスを自動的に反映させた、共有メモリ型DB運用)技術の応用です。
1.VB.NETには、JSONファイルからクラス構造をコード生成する機能があります。
2.JSON.NETを使うと、JSONファイルからクラス構造を反映したオブジェクトを動的に作れます。
3.eXTreme技術は、VB.NET上のクラス構造を自動的にCache'DBに反映させてテーブルを生成してくれます。
これらを組み合わせると、何が起きるか:
「プログラマがテーブルのフィールドを一切知らなくても、正しいテーブル構造を(しかもオブジェクト的に)解析し、クラスを生成して取り扱い、インスタンスの動的生成、データ保存まで自動化できる」ということが可能になります。
この機能の何が素晴らしいかというと、
ひと昔前なら:ソケット通信で「接続仕様書を送って下さい」と言って、紙をもらい、同じオブジェクト構造を手で入力し、そしてO/Rマッピングを考え、という段階を省略できます。
最近なら:ベンダー間において「JSON形式でデータを受け取ってほしいんです」というリクエストに対し、「接続仕様書を送ってください」と言って、紙をもらい、JSON.NETでクラスまでは生成するけれども、O/Rマッピングが結局必要で困ってしまう、というシチュエーションを解消できます。
Vb.NET側の準備;
プロジェクトを新規生成し、プロジェクト→NuGetパッケージの管理を開く。Neutonsoft.Jsonを検索し、安定版をインストールする。
過去にインストールしたことがあれば、プロジェクト→参照の追加から、アセンブリでJSON.NETを探してチェックする方法もOK。
プロジェクト→参照の追加で、
InterSystems.Data.CacheClient.dll
InterSystems.Data.CacheExtreme.dllを追加する。
(場所は画像を参考に)
VB.NETで追加→新規の項目で、JSON構造を記述するクラスファイル(ここではTestJSON.vb)を作成する。
取り込みたいJSONファイル(ここではC:\data\test.jsonとした)をメモ帳などで開き、全選択→コピーし、TestJSON.vbの編集画面で編集→JSONをクラスとして貼り付けるとすると、構造が自動的にクラス化される。
{
"version": "1.0.0",
"contents": {
"package": {
"displayName": "Red テーマ",
"description": "Visual Studio Code の Red テーマ"
}
}
}
Public Class Rootobject
Public Property version As String
Public Property contents As Contents
End Class
Public Class Contents
Public Property package As Package
End Class
Public Class Package
Public Property displayName As String
Public Property description As String
End Class
コアとなるコードは次の通り。
一方のクラスでeXTremeのImportSchemaでVB.NETをDB構造として準備する。
そのクラスインスタンスにJsonConvert.DeserializeObject(Of VBCacheJSONTest.Rootobject)を用い、JSONファイルをJSON.NETで読み込んで型変換する。
そのデータはDB上にStoreするだけで正しく保存される。
またクラスインスタンスはドット構文で記述できるので、ポリモーフィズムも自在である。
Imports InterSystems.XEP
Imports Newtonsoft.Json
Imports VBCacheJSONTest
Public Class VBJSONeXTreme
Sub testSub()
'Setup eXTreme
Dim namespc As String = "USER"
Dim username As String = "yourname"
Dim password As String = "yourpass"
Dim myPersister As EventPersister = PersisterFactory.CreatePersister()
myPersister.Connect(namespc, username, password)
'Dynamic Class Generation
Dim className As String = "VBCacheJSONTest.Rootobject"
myPersister.ImportSchema(className) 'Cache'側のClassも呼び出せるとのこと
Dim newEvent As InterSystems.XEP.Event = myPersister.GetEvent(className)
'Data Read From JSON File
Dim eventData As Rootobject
eventData = JsonConvert.DeserializeObject(Of VBCacheJSONTest.Rootobject)(File.ReadAllText("c:\data\Test.json"))'ここがStringで記述すれば、通信時のデータを直接(構造ごと)投げ込める
Dim str As String = eventData.version 'JSONをオブジェクト指向で使う方法
MsgBox(str)
'Save To Cache eXTreme
Dim itemIDs As Long = newEvent.Store(eventData)
myPersister.Close()
End Sub
End Class
フォーム上からの呼び出しは次の通り。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim d As New VBJSONeXTreme()
d.testSub()
End Sub
Cache→管理ポータル→システムエクスプローラ→SQLでの実行結果は次の通り。JSONのクラス階層がテーブル名としてどのように反映されているかに注目です。