C#で「DataContractJsonSerializer」を使って、JSONのシリアライズ/デシリアライズをしてみました!
- DataContractJsonSerializer
- 導入方法
- JSONと対応するクラス
- JSONを取り扱うクラス
- usingの追加
- シリアライズ(データ→JSON)
- デシリアライズ(JSON→データ)
- 参考
- あとがき
DataContractJsonSerializer
JSONを操作するためのライブラリです。
.NET Frameworkに含まれるため、NuGetなどで別途インストールしなくても使用する事ができます!
導入方法
ソリューションエクスプローラで、「参照」を右クリック。
そこから「参照の追加」を選択します。
参照マネージャーが開きます。
サイドメニューから「アセンブリ」をクリック。
検索バーで
System.Runtime.Serialization
で検索!
入力途中でも、「System.Runtime.Serialization」が出てきたらそこでOK!
「System.Runtime.Serialization」にチェックを入れて追加します。
同じように
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
ちゃんとデシリアライズできてますね!
参考
コチラを参考にしました。ありがとうございました!
あとがき
C#で「DataContractJsonSerializer」を使ってJSONをシリアライズ/デシリアライズする方法でした!
思ったより簡単にできるんだなーという印象でした。
数行のコードで、一発でクラス化してくれるとかめっちゃ楽ですね!
こういうのやってから、C言語のような古めの言語をコーディングすると
「……なんなの……めっちゃめんどいんだけど……」
とかなりますね!(笑)
参照から追加するだけで使えるようになるので、お試しくださいませ。