.NET Core 環境におけるオブジェクトとファイルの JSON シリアライズ、JSON 逆シリアライズ

最近は、世の中 JSON だらけだ。
REST のレスポンス、構成ファイル等々。

一時の XML ブームの産物を置換している。

JSON は、その名の通り、オブジェクトを表記するためのものなので、オブジェクトのシリアライズと極めて相性が良い。

XML も良いのだけど、属性を使うのか、要素の値を使うのかなど、人によって表記が異なることがある点が問題となることがある。

現時点では、オブジェクトのシリアライズの表記には、JSON が最も適していると考えている。

コードは、これまでと変わらないが、.NET Core 環境で JSON シリアライズ、JSON 逆シリアライズを行う方法について。

今回の例では、"コンソール アプリ(.Net Core)" のテンプレートを利用する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/6d25c2f4-d2a6-682d-11c8-b4a6a0a3921f.png)


最初に、NuGet から、"System.Runtime.Serialization.Json" 及び "System.Runtime.Serialization.Primitives" をダウンロードし、参照設定する。

プロジェクトのコンテキスト メニューから、[NuGet パッケージの管理] を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/ac4f5e50-42ec-04ec-0025-7f01d8ab69ab.png)

[参照] を選択し、検索ボックスに "System.Runtime.Serialization" と入力し、[System.Runtime.Serialization.Json] 及び [System.Runtime.Serialization.Primitives] のそれぞれの [インストール] を選択してインストールを完了する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172205/300f6e24-6e15-77bb-1f1e-d01274bbdfec.png)

シリアライズ、逆シリアライズ対象のクラスを定義する。

```csharp:Person.cs

using System;
using System.Collections.Generic;
using System.Text;

using System.Runtime.Serialization;


namespace JsonSerializationApp001
{
    [DataContract]
    internal class Person
    {
        [DataMember]
        internal string Name { get; set; }

        [DataMember]
        internal int Age { get; set; }
    }
}


```

オブジェクトを JSON シリアライズし、ファイル ストリームへ書き出し、そのファイルから、オブジェクトへ逆シリアライズするサンプル コード。

```csharp:Program.cs

using System;

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

namespace JsonSerializationApp001
{
    class Program
    {
        static void Main(string[] args)
        {
            //System.Text.Encoding.CodePages を NuGet で追加
            //コンソールの文字コードの設定
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            Person person = new Person { Name = "板部岡 江雪斎", Age = 72 };

            //シリアライザーのインスタンスを生成
            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));

            string filePath = Path.Combine(Directory.GetCurrentDirectory(), "person.json");
                
            //出力ファイル ストリームの生成
            using (FileStream stream = new FileStream(filePath, FileMode.OpenOrCreate))
            {
                //シリアライズ
                jsonSerializer.WriteObject(stream, person);
            }

            Console.WriteLine($"object was serialized. file path is {filePath}");

            Person deSerializedPerson = null;

            //入力ファイル ストリームの生成
            //using (FileStream stream = new FileStream(filePath, FileMode.Open))
            using (Stream stream = File.Open(filePath, FileMode.Open))
            {
                //逆シリアライズ
                deSerializedPerson = jsonSerializer.ReadObject(stream) as Person;
            }

            Console.WriteLine($"deserialized an instance of the object.");
            Console.WriteLine($"Person.Name={deSerializedPerson.Name}, Person.Age={deSerializedPerson.Age}");


            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

```

コードは、今までと変わらないけど、NuGet から、各種ライブラリーをロードする必要があるので、注意が必要。