ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

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
                }
            ]
        }
    ]
}