最近は、世の中 JSON だらけだ。
REST のレスポンス、構成ファイル等々。
一時の XML ブームの産物を置換している。
JSON は、その名の通り、オブジェクトを表記するためのものなので、オブジェクトのシリアライズと極めて相性が良い。
XML も良いのだけど、属性を使うのか、要素の値を使うのかなど、人によって表記が異なることがある点が問題となることがある。
現時点では、オブジェクトのシリアライズの表記には、JSON が最も適していると考えている。
コードは、これまでと変わらないが、.NET Core 環境で JSON シリアライズ、JSON 逆シリアライズを行う方法について。
今回の例では、"コンソール アプリ(.Net Core)" のテンプレートを利用する。
最初に、NuGet から、"System.Runtime.Serialization.Json" 及び "System.Runtime.Serialization.Primitives" をダウンロードし、参照設定する。
プロジェクトのコンテキスト メニューから、[NuGet パッケージの管理] を選択する。
[参照] を選択し、検索ボックスに "System.Runtime.Serialization" と入力し、[System.Runtime.Serialization.Json] 及び [System.Runtime.Serialization.Primitives] のそれぞれの [インストール] を選択してインストールを完了する。
シリアライズ、逆シリアライズ対象のクラスを定義する。
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 シリアライズし、ファイル ストリームへ書き出し、そのファイルから、オブジェクトへ逆シリアライズするサンプル コード。
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 から、各種ライブラリーをロードする必要があるので、注意が必要。