C#で「Json.NET」を使って、JSONのシリアライズ/デシリアライズをしてみました!
Json.NET
JSONを操作するためのライブラリです。
.NET用に作られた、Jsonのライブラリです。
MITライセンスに基づいて、オープンソース。
そして商用利用が無料なのがスバラシイですね。
公式ページいわく、性能比較でも高速のようです。
以前紹介した、DataContractJsonSerializerよりも早いようです。
なんということでしょう……
インストール
まずは必要なパッケージを、プロジェクトにインストールします。
「ツール→NuGetパッケージマネージャー→ソリューションのNuGetパッケージの管理」と進みます。
「参照タブ」に移動して、検索バーで「Json.NET」で検索します。
「Newtonsoft.Json」を選択します。
右側のリストにある、対象プロジェクトにチェックを入れます。
そして「インストールボタン」を押します。
変更プレビューで「OKボタン」を押します。
インストール完了を待ちます。
するとインストールが進み、パッケージマネージャーの出力にこのように出力され、インストールが完了します。
'.NETFramework,Version=v4.6.1' を対象とするプロジェクト 'TestJsonRW' に関して、パッケージ 'Newtonsoft.Json.12.0.2' の依存関係情報の収集を試行しています 依存関係情報の収集に 197.27 ms かかりました DependencyBehavior 'Lowest' でパッケージ 'Newtonsoft.Json.12.0.2' の依存関係の解決を試行しています 依存関係情報の解決に 0 ms かかりました パッケージ 'Newtonsoft.Json.12.0.2' をインストールするアクションを解決しています パッケージ 'Newtonsoft.Json.12.0.2' をインストールするアクションが解決されました 'nuget.org' からパッケージ 'Newtonsoft.Json 12.0.2' を取得しています。 GET https://api.nuget.org/v3-flatcontainer/newtonsoft.json/12.0.2/newtonsoft.json.12.0.2.nupkg OK https://api.nuget.org/v3-flatcontainer/newtonsoft.json/12.0.2/newtonsoft.json.12.0.2.nupkg 11 ミリ秒 Newtonsoft.Json 12.0.2 をインストールしています。 パッケージ 'Newtonsoft.Json.12.0.2' をフォルダー 'C:\work\TestJsonRW\packages' に追加しています パッケージ 'Newtonsoft.Json.12.0.2' をフォルダー 'C:\work\TestJsonRW\packages' に追加しました パッケージ 'Newtonsoft.Json.12.0.2' を 'packages.config' に追加しました 'Newtonsoft.Json 12.0.2' が TestJsonRW に正常にインストールされました NuGet の操作の実行に 3.18 sec かかりました 経過した時間: 00:00:03.8865614 ========== 終了 ==========
ソリューションエクスプローラの参照をチェックして、「Newtonsoft.Json」が追加されていればOKです!
JSONに対応したクラス
データ用のクラスとしては、以前使用したクラスを流量します。
internal class Data { internal int type; internal string name; internal int size; } internal class Datas { internal List<Data> dataList; }
シリアライズ
シリアライズ処理はこのように作成しました。
public string Serialize(Data data, bool isIndented = false) { Console.WriteLine("* Data - indent:" + isIndented); Formatting formatting = isIndented ? Formatting.Indented : Formatting.None; string json = JsonConvert.SerializeObject(data, formatting); Console.WriteLine(json); return json; } public string Serialize(Data[] data, bool isIndented = false) { Console.WriteLine("* Data[] - indent:" + isIndented); Formatting formatting = isIndented ? Formatting.Indented : Formatting.None; string json = JsonConvert.SerializeObject(data, formatting); Console.WriteLine(json); return json; } public string Serialize(List<Data> data, bool isIndented = false) { Console.WriteLine("* List<Data> - indent:" + isIndented); Formatting formatting = isIndented ? Formatting.Indented : Formatting.None; string json = JsonConvert.SerializeObject(data, formatting); Console.WriteLine(json); return json; } public string Serialize(Datas data, bool isIndented = false) { Console.WriteLine("* Datas - indent:" + isIndented); Formatting formatting = isIndented ? Formatting.Indented : Formatting.None; string json = JsonConvert.SerializeObject(data, formatting); Console.WriteLine(json); return json; }
出力
各関数を順番に実行すると、このように出力されました。
--- Serialize ---
* Data - indent:False
{"type":12,"name":"double","size":8}
* Data[] - indent:False
[{"type":3,"name":"short","size":2},{"type":2,"name":"uchar","size":1},{"type":11,"name":"float","size":4}]
* List - indent:False
[{"type":3,"name":"short","size":2},{"type":2,"name":"uchar","size":1},{"type":11,"name":"float","size":4}]
* Datas - indent:False
{"dataList":[{"type":3,"name":"short","size":2},{"type":2,"name":"uchar","size":1},{"type":11,"name":"float","size":4}]}
インデントありのJSONにする
JsonConvert.SerializeObject()の第2引数を、「Formatting.Indented」にすることで、インデントをONにするよう設定できます。
この設定を行うと、このようなJSONとなります。
{
"type": 12,
"name": "double",
"size": 8
}
生成されたJSON自体を、可視化する必要のあるケースでなければ、特に必要ないかとは思います。
例えば、人が見る可能性のあるテキストファイルに出力する場合などは、「Formatting.Indented」にした方が見やすくて良さそうですね!
デシリアライズ
デシリアライズ処理はこのように作成しました。
Show~()は出力用の関数です。
private void ShowData(Data data) { Console.WriteLine("type=" + data.type + ", name=" + data.name + ", size=" + data.size); } private void ShowDatas(Data[] datas) { foreach ( Data data in datas ) { this.ShowData(data); } } private void ShowDatas(List<Data> datas) { foreach ( Data data in datas ) { this.ShowData(data); } } private void ShowDatas(Datas datas) { foreach ( Data data in datas.dataList ) { this.ShowData(data); } } public void DeserializeData(string json) { Console.WriteLine("* Data"); Data data = JsonConvert.DeserializeObject<Data>(json); this.ShowData(data); } public void DeserializeDataArr(string json) { Console.WriteLine("* Data[]"); Data[] data = JsonConvert.DeserializeObject<Data[]>(json); this.ShowDatas(data); } public void DeserializeDataList(string json) { Console.WriteLine("* List<Data>"); List<Data> data = JsonConvert.DeserializeObject<List<Data>>(json); this.ShowDatas(data); } public void DeserializeDatas(string json) { Console.WriteLine("* Datas"); Datas data = JsonConvert.DeserializeObject<Datas>(json); this.ShowDatas(data); }
出力
デシリアライズした結果は、このように出力されました。
--- Deserialize ---
* Data
type=12, name=double, size=8
* Data[]
type=3, name=short, size=2
type=2, name=uchar, size=1
type=11, name=float, size=4
* List
type=3, name=short, size=2
type=2, name=uchar, size=1
type=11, name=float, size=4
* Datas
type=3, name=short, size=2
type=2, name=uchar, size=1
type=11, name=float, size=4
* Data
type=12, name=double, size=8
試してみた所感
DataContractJsonSerializerという、.NETに付属しているものを前回は試しましたが……
正直段違いにラクラクです。
最初に手続きしてから使う、DataContractJsonSerializer。
それに対しJson.NETは、関数に渡すだけでOKですからね……
公式が出している速度を見ても、こちらを使ったほうが色々とメリットが大きいように感じます。
参考
コチラを参考にしました。ありがとうございました!
あとがき
C#の「Json.NET」でJSONを超簡単にシリアライズ/デシリアライズする方法でした!
「これ使っちゃえばもう楽勝やん(笑)」
ってくらい簡単なので、是非お試しを……!
「ただ環境的にパッケージのインストールがNGなんだ……」
という場合は、DataContractJsonSerializerを使うのがベターですね。