lisz-works

技術と興味の集合体

C#のJson.NETでJSONを超簡単にシリアライズ/デシリアライズする方法!

【スポンサーリンク】

C#

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

Json.NET

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

.NET用に作られた、Jsonのライブラリです。

MITライセンスに基づいて、オープンソース。
そして商用利用が無料なのがスバラシイですね。

公式ページいわく、性能比較でも高速のようです。

速度比較(公式) 引用: Json.NET - Newtonsoft

以前紹介した、DataContractJsonSerializerよりも早いようです。

なんということでしょう……

インストール

まずは必要なパッケージを、プロジェクトにインストールします。

Nugetパッケージマネージャを開く

「ツール→NuGetパッケージマネージャー→ソリューションのNuGetパッケージの管理」と進みます。

Json.NETを検索

「参照タブ」に移動して、検索バーで「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ですからね……

公式が出している速度を見ても、こちらを使ったほうが色々とメリットが大きいように感じます。

参考

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

dev.classmethod.jp

www.newtonsoft.com

あとがき

C#の「Json.NET」でJSONを超簡単にシリアライズ/デシリアライズする方法でした!

「これ使っちゃえばもう楽勝やん(笑)」

ってくらい簡単なので、是非お試しを……!

「ただ環境的にパッケージのインストールがNGなんだ……」

という場合は、DataContractJsonSerializerを使うのがベターですね。

www.lisz-works.com