lisz-works

技術と興味の集合体

C# DataContractJsonSerializerでJSONを扱う!シリアライズ/デシリアライズ

【スポンサーリンク】

C#

C#で「DataContractJsonSerializer」を使って、JSONのシリアライズ/デシリアライズをしてみました!

DataContractJsonSerializer

JSONを操作するためのライブラリです。

.NET Frameworkに含まれるため、NuGetなどで別途インストールしなくても使用する事ができます!

導入方法

ソリューションエクスプローラで、「参照」を右クリック。

そこから「参照の追加」を選択します。

参照の追加

参照マネージャーが開きます。
サイドメニューから「アセンブリ」をクリック。

参照マネージャー→アセンブリ

検索バーで

System.Runtime.Serialization

で検索!

System.Runtime.Serializationを追加

入力途中でも、「System.Runtime.Serialization」が出てきたらそこでOK!

「System.Runtime.Serialization」にチェックを入れて追加します。

同じように

System.Xml

を検索!

System.Xmlを追加

これも出てきたら「System.Xml」にチェックを入れて追加します。

ぼくの場合、これは元からチェックが入っていました。

JSONと対応するクラス

using System.Runtime.Serialization;

namespace TestJsonRW
{
    [DataContract]
    internal class Data
    {
        [DataMember]
        internal int type;
        [DataMember]
        internal string name;
        [DataMember]
        internal int size;
    }
}

クラスには「[DataContract]」という属性が必要です。

JSONと対応する変数は、「[DataMember]」という属性が必要となります。

JSONを取り扱うクラス

「TestDataContractJsonSerializer」という、長ったらしい名前のクラスを作ってみました。

コレに

  • Serialize : データ→JSON
  • Deserialize : JSON→データ

をする関数を作りました。

usingの追加

まずはこれらをusingで指定します。

using System.Runtime.Serialization.Json;
using System.IO;
using static System.Console;

シリアライズ(データ→JSON)

クラスにこのようなシリアライズ関数を追加しました。

public string Serialize(Data data)
{
    string json = "";

    using ( var ms = new MemoryStream() )
    using ( var sr = new StreamReader(ms) )
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Data));
        serializer.WriteObject(ms, data);
        ms.Position = 0;

        json = sr.ReadToEnd();

        WriteLine($"{json}");
    }

    return json;
}

シリアライズを実行してみる

まず定義したJSONのデータを表すクラスを作ります。

Data data = new Data
{
    type = 12,
    name = "double",
    size = 8
};

1個1個変数へセットしないと……
と思っていましたが、今はこんな書き方ができるんですね……

コレを渡して、シリアライズしてみます。

TestDataContractJsonSerializer serializer = new TestDataContractJsonSerializer();
string json = serializer.Serialize(data);

結果、このようなテキストが生成されました。

{"name":"double","size":8,"type":12}

ちゃんとデータの中身が、JSON化していますね!

デシリアライズ(JSON→データ)

JSONデータから、定義したクラスに変換します。

public void Deserialize(string json)
{
    using ( var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)) )
    {
        var sr = new DataContractJsonSerializer(typeof(Data));
        var data = (Data)sr.ReadObject(ms) as Data;
        Console.WriteLine("type=" + data.type + ", name=" + data.name + ", size=" + data.size);
    }
}

デシリアライズを実行してみる

シリアライズで取得したJSONを、デシリアライズさせます。

TestDataContractJsonSerializer serializer = new TestDataContractJsonSerializer();
string json = serializer.Serialize(data);
serializer.Deserialize(json);

結果はこのように表示されました。

type=12, name=double, size=8

ちゃんとデシリアライズできてますね!

参考

コチラを参考にしました。ありがとうございました!

dev.classmethod.jp

docs.microsoft.com

あとがき

C#で「DataContractJsonSerializer」を使ってJSONをシリアライズ/デシリアライズする方法でした!

思ったより簡単にできるんだなーという印象でした。

数行のコードで、一発でクラス化してくれるとかめっちゃ楽ですね!

こういうのやってから、C言語のような古めの言語をコーディングすると

「……なんなの……めっちゃめんどいんだけど……」

とかなりますね!(笑)

参照から追加するだけで使えるようになるので、お試しくださいませ。