[C#][.NET][JSON] オブジェクトのシリアライズ/デシリアライズ(Json.NETの使用方法)

先日書いた以下の記事をJSONを使ったものでも実装してみた。

[[C#][.NET][XML] オブジェクトのシリアライズ/デシリアライズ(DataContractSerializerの使用方法) - Qiita](http://qiita.com/koara-local/items/5307f26d8cc9f33be038)

Jsonでのメリットとしては変数の定義順に左右されなくなるとのこと。処理速度の差については未確認。
標準の `DataContractJsonSerializer` もあるらしいが、今回は `Json.NET(MIT License)` を利用してみた。

[Json.NET - Newtonsoft](http://www.newtonsoft.com/json)

# 事前準備
Nugetでパッケージをインストール。
[NuGet Gallery | Json.NET 9.0.1](https://www.nuget.org/packages/Newtonsoft.Json/)

```
Install-Package Newtonsoft.Json
```

# usingの設定

```csharp
using Newtonsoft.Json;
```

# 使用方法
実装は [XMLで実装したもの](http://qiita.com/koara-local/items/5307f26d8cc9f33be038#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95) の使いまわし。

```csharp:サンプル実装
using Newtonsoft.Json;
using System.Diagnostics;
using System.IO;
using System.Text;

namespace ConsoleApplication1
{
    public class Fuga
    {
        public string ClassText;
    }

    public class Hoge
    {
        public string Text;

        [JsonIgnore]
        public string IgnoreText;

        public Fuga fuga { get; set; } = new Fuga();
    }

    public class JSONSerializer<Type>
    {
        private string fileName;

        public JSONSerializer(string fileName)
        {
            this.fileName = fileName;
        }

        public void Write(Type obj)
        {
            var json = JsonConvert.SerializeObject(obj, Formatting.Indented);

            using (var sw = new StreamWriter(fileName, false, Encoding.UTF8))
            {
                sw.Write(json);
            }
        }

        public Type Read()
        {
            using (var sr = new StreamReader(fileName, Encoding.UTF8))
            {
                var data =  sr.ReadToEnd();
                return JsonConvert.DeserializeObject<Type>(data);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string fileName = @"test.json";

            var obj = new Hoge();
            obj.Text = "hogetext";
            obj.IgnoreText = "ignoretext";
            obj.fuga.ClassText = "fugatext";

            var serializer = new JSONSerializer<Hoge>(fileName);

            serializer.Write(obj);

            Hoge readobj = serializer.Read();

            Debug.WriteLine($"{nameof(readobj.Text)} : {readobj.Text}");
            Debug.WriteLine($"{nameof(readobj.IgnoreText)} : {readobj.IgnoreText}");
            Debug.WriteLine($"{nameof(readobj.fuga.ClassText)} : {readobj.fuga.ClassText}");
        }
    }
}
```

```json:json出力
{
  "Text": "hogetext",
  "fuga": {
    "ClassText": "fugatext"
  }
}
```

```console:デバッグ出力
Text : hogetext
IgnoreText : 
ClassText : fugatext
```

除外以外には特に指定もいらず簡単に実装できた。

特記事項としては以下になる。

+ シリアライズ時の除外指定には `[JsonIgnore]` の属性を使用する

上記の通り使用方法がシンプルなのと、公式のドキュメントがわりと整備されているため実装には特に困らないと思われる。

+ [Introduction](http://www.newtonsoft.com/json/help/html/Introduction.htm)
+ [Samples](http://www.newtonsoft.com/json/help/html/Samples.htm)

# 参考
[Serialize an Object](http://www.newtonsoft.com/json/help/html/SerializeObject.htm)
[Deserialize an Object](http://www.newtonsoft.com/json/help/html/DeserializeObject.htm)
[C# Json.NET 入門1：JsonConvert - BEACHSIDE BLOG](http://beachside.hatenablog.com/entry/2016/04/18/193000)