Jsonファイルの読込み、書込み
データを保存したり、マスターデータを読み込んだりしたいときはCSVでデータファイルを作っていたのを、Jsonファイルにしてみた。
Jsonファイルの読み書きは、DataContractJsonSerializerを使用すれば簡単に使える。
Jsonファイルの内容をクラスとして扱える(シリアル化、逆シリアル化)ようになる。
使用するには、参照で System.Runtime.Serialization を追加する。
Dim trend As New TrendGroup 'TrendGroup.jsonを読み込んで、TrendGroupクラスにデータを格納する。 Util.ReadJson(Of TrendGroup)("C:\TrendGroup.json", trend) '何か処理 'TrendGroupクラスのデータをTrendGroup.jsonに保存する。 Util.WriteJson(Of TrendGroup)("C:\TrendGroup.json", trend)
ファイル名:Util.vb
Imports System.Runtime.Serialization.Json Public Class Util ''' <summary> ''' JSONファイルの書込 ''' </summary> ''' <typeparam name="T"></typeparam> ''' <param name="path"></param> ''' <param name="target"></param> ''' <returns></returns> Public Shared Function WriteJson(Of T)(path As String, ByRef target As T) As Boolean Dim encUTF8 As System.Text.Encoding = New System.Text.UTF8Encoding(False) Dim resValue As Boolean = True Dim memory As New IO.MemoryStream Try 'クラスのデータをJSON形式に変換(シリアル化) Dim serializer As New DataContractJsonSerializer(GetType(T)) serializer.WriteObject(memory, target) Dim json As String = encUTF8.GetString(memory.ToArray()) 'データの書込 Dim writer As New IO.StreamWriter(path, False, encUTF8) Try writer.Write(json) Catch ex As Exception resValue = False Finally writer.Close() End Try Catch ex As Exception resValue = False Finally memory.Close() End Try Return resValue End Function ''' <summary> ''' JSONファイルの読込 ''' </summary> ''' <typeparam name="T"></typeparam> ''' <param name="path"></param> ''' <param name="target"></param> ''' <returns></returns> Public Shared Function ReadJson(Of T)(ByVal path As String, ByRef target As T) As Boolean Dim encUTF8 As System.Text.Encoding = New System.Text.UTF8Encoding(False) Dim resValue As Boolean = True Dim reader As New IO.StreamReader(path, encUTF8) Try 'データの読込 Dim json As String = reader.ReadToEnd() Dim memory As New IO.MemoryStream(encUTF8.GetBytes(json)) Try 'JSON形式のデータをクラスに変換(逆シリアル化) Dim serializer As New DataContractJsonSerializer(GetType(T)) target = DirectCast(serializer.ReadObject(memory), T) Catch ex As Exception resValue = False Finally memory.Close() End Try Catch ex As Exception resValue = False Finally reader.Close() End Try Return resValue End Function End Class
Order:=0とか付けておくと、保存したときにOrderの順番で保存される。
付けないとアルファベット順に保存される。(順番は読み書きするには問題ないけど)
ファイル名:TrendGroup.vb
Imports System.Runtime.Serialization.Json <DataContract()> Public Class TrendGroup <DataContract()> Public Class Axis <DataMember(Order:=0)> Public Property Minimum As Double <DataMember(Order:=1)> Public Property Maximum As Double <DataMember(Order:=2)> Public Property Interval As Double End Class <DataContract()> Public Class Trend <DataMember(Order:=0)> Public Property TrendNo As Integer <DataMember(Order:=1)> Public Property AxisType As Integer <DataMember(Order:=2)> Public Property LineColor As Integer End Class <DataContract()> Public Class Member <DataMember(Order:=0)> Public Property GroupNo As Integer <DataMember(Order:=1)> Public Property GroupName As String <DataMember(Order:=2)> Public Property Axis1 As Axis <DataMember(Order:=3)> Public Property Axis2 As Axis <DataMember(Order:=4)> Public Property Trend As Trend() End Class <DataMember(Order:=0)> Public Property TrendGroup As Member() End Class
Jsonファイルを書き込むと、整形しないと見づらくなるので整形用ツールを用意しておくと便利。
Jsonファイルは、UTF-8(BOMなし)で保存する。
ファイル名:TrendGroup.json
{ "TrendGroup": [ { "GroupNo": 1, "GroupName": "グループNo1", "Axis1": { "Minimum": -30, "Maximum": 30, "Interval": 5 }, "Axis2": { "Minimum": 0, "Maximum": 100, "Interval": 5 }, "Trend": [ { "TrendNo": 1, "AxisType": 0, "LineColor": -65536 }, { "TrendNo": 2, "AxisType": 0, "LineColor": -23296 }, { "TrendNo": 3, "AxisType": 1, "LineColor": -256 } ] }, { "GroupNo": 2, "GroupName": "グループNo2", "Axis1": { "Minimum": 0, "Maximum": 60, "Interval": 5 }, "Axis2": { "Minimum": 0, "Maximum": 100, "Interval": 5 }, "Trend": [ { "TrendNo": 4, "AxisType": 0, "LineColor": -65536 }, { "TrendNo": 5, "AxisType": 0, "LineColor": -23296 }, { "TrendNo": 6, "AxisType": 1, "LineColor": -256 } ] } ] }