JSON形式でクラスをシリアライズする場合には、JsonSerializer または DataContractJsonSerializer を利用します。
.NET Core 3.0 以降 .NET 5 以降の場合は、JsonSerializerを利用できシンプルに実装できます。
下図のフォームを作成します。
以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JsonSerializeNetDemo
{
public partial class FormSerialize : Form
{
public FormSerialize()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyInfo mi = new MyInfo();
mi.ID = Convert.ToInt32(textBox1.Text);
mi.Name = textBox2.Text;
mi.Value = textBox3.Text;
string JsonString = JsonSerializer.Serialize(mi);
textBox4.Text = JsonString;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JsonSerializeNetDemo
{
public class MyInfo
{
public int ID { get; set; }
public string Name { get; set; } = "";
public string Value { get; set; } = "";
}
}
情報格納クラスのインスタンスを作成しメンバ(プロパティ)に値を代入します。
MyInfo mi = new MyInfo();
mi.ID = Convert.ToInt32(textBox1.Text);
mi.Name = textBox2.Text;
mi.Value = textBox3.Text;
JsonSerializer.Serialize()
メソッドを呼び出して、JSON形式にシリアライズしてテキストボックスに表示します。
string JsonString = JsonSerializer.Serialize(mi);
textBox4.Text = JsonString;
プロジェクトを実行します。下図のウィンドウが表示されます。
テキストボックスに値を入力して、[Serialize]ボタンをクリックします。
下部のテキストボックスに結果が表示されます。クラスのプロパティの情報が
JSON形式の文字列で表現されています。が、文字列が実体参照の表現になっています。
実体参照の表現にならないようにするため、プログラムを変更します。
フォームにボタンを追加し、クリックイベントを実装します。
/*
(略)
*/
namespace JsonSerializeNetDemo
{
public partial class FormSerialize : Form
{
/*
(略)
*/
private void button2_Click(object sender, EventArgs e)
{
MyInfo mi = new MyInfo();
mi.ID = Convert.ToInt32(textBox1.Text);
mi.Name = textBox2.Text;
mi.Value = textBox3.Text;
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
string JsonString = JsonSerializer.Serialize(mi, options);
textBox4.Text = JsonString;
}
}
}
JsonSerializerOptions オブジェクトを作成し、Encoderを設定します。JavaScriptEncoder.Create()
メソッドの引数に
UnicodeRanges.All
を与えてエンコーダーを作成します。
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
シリアライズする際に、Serialize
メソッドの第二引数に先に作成した JsonSerializerOptions オブジェクトを与えます。
string JsonString = JsonSerializer.Serialize(mi, options);
プロジェクトを実行しフォームに入力します。
[Serialize(Unicode)]ボタンをクリックします。実体参照でない文字列で出力結果が表示されます。
.NET FrameworkではJsonSerilizerが無いため、ここで紹介するDataContractJsonSerializerを利用するか、Newtonsoft.Json を利用します。
新規のWindowsフォームアプリケーションプロジェクトを作成します。アセンブリの参照に、System.Runtime.Serialization
を追加します。
下図のフォームをデザインします。
コントロール名は以下の通りです。
以下のコードを実装します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace JsonSerializeDemo
{
[System.Runtime.Serialization.DataContract]
class InfoClass
{
[System.Runtime.Serialization.DataMember()]
public int ID { get; set; }
[System.Runtime.Serialization.DataMember()]
public string Name { get; set; }
}
}
using System.Runtime.Serialization.Json;
を追加し、シリアライズのクラスを参照できるようにします。プロジェクトの[参照設定]にもSystem.Runtime.Serializationアセンブリの参照を追加します。
シリアライズするクラス(InfoClass)に
[System.Runtime.Serialization.DataContract]
を記述しDataContract属性を付与します。[System.Runtime.Serialization.DataMember()]
を記述し、DataMember属性を付与します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Json;
namespace JsonSerializeDemo
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(InfoClass));
InfoClass infoc = new InfoClass();
infoc.ID = Convert.ToInt32(textBox_ID.Text);
infoc.Name = textBox_Name.Text;
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, infoc);
string JsonString = Encoding.UTF8.GetString(ms.ToArray());
textBox_Output.Text = JsonString;
}
private void button2_Click(object sender, EventArgs e)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(InfoClass));
byte[] bytes = Encoding.UTF8.GetBytes(textBox_Output.Text);
MemoryStream ms = new MemoryStream(bytes);
InfoClass infoc = (InfoClass)serializer.ReadObject(ms);
textBox_ID.Text = Convert.ToString(infoc.ID);
textBox_Name.Text = infoc.Name;
}
private void button3_Click(object sender, EventArgs e)
{
textBox_ID.Text = "";
textBox_Name.Text = "";
}
}
}
using節に下記コードを追加し、シリアライズのクラスを参照できるようにします。プロジェクトの[参照設定]にもSystem.Runtime.Serializationアセンブリの参照を追加します。
using System.Runtime.Serialization.Json;
下記のコードにてシリアライザのインスタンスを作成します。
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(InfoClass));
下記コードにて、情報格納クラスのインスタンスを作成しメンバ(プロパティ)に値を代入します。
InfoClass infoc = new InfoClass();
infoc.ID = Convert.ToInt32(textBox_ID.Text);
infoc.Name = textBox_Name.Text;
下記コードにて、シリアライズした情報を格納するメモリストリームを準備します。
MemoryStream ms = new MemoryStream();
シリアライザーのWriteObjectメソッドを用いてシリアライズします。シリアライズされたデータは先に準備したメモリストリームに書き込まれます。
serializer.WriteObject(ms, infoc);
メモリストリームからデータを読み出しUTF8にエンコードして文字列を取得します。
string JsonString = Encoding.UTF8.GetString(ms.ToArray());
アプリケーションを実行し、Serializeボタンを押すと下図の画面のようにJSON形式でシリアライズされたクラス情報がテキストボックスに表示されます。
クラスの情報をJSON形式でシリアライズしOutputのテキストボックスに表示されていることがわかります。
Clearボタンを押しID,NameテキストボックスをクリアしたのちDeSerializeボタンを押すと、JSONの内容からクラスのインスタンスを作成しメンバ(プロパティに)格納された値を画面に表示できます。