LoginSignup
15

More than 5 years have passed since last update.

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

Posted at

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

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

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

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

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

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

今回の例では、"コンソール アプリ(.Net Core)" のテンプレートを利用する。
image.png

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

プロジェクトのコンテキスト メニューから、[NuGet パッケージの管理] を選択する。
image.png

[参照] を選択し、検索ボックスに "System.Runtime.Serialization" と入力し、[System.Runtime.Serialization.Json] 及び [System.Runtime.Serialization.Primitives] のそれぞれの [インストール] を選択してインストールを完了する。
image.png

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

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 シリアライズし、ファイル ストリームへ書き出し、そのファイルから、オブジェクトへ逆シリアライズするサンプル コード。

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 から、各種ライブラリーをロードする必要があるので、注意が必要。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15