JSON形式でクラスをシリアライズするコードと実行結果

ジョナスン
質問:JSONデータを作成したい
Web APIの戻り値でJSONを返そうと思います。文字列をくみ上げるのは大変そうなので、クラスを作成してクラスをシリアライズしてJSONの戻り値の文字列を生成しようと思います。 クラスのオブジェクト情報をJSONの文字列する方法を教えてください~

概要

JSON形式でクラスをシリアライズする場合には、JsonSerializer または DataContractJsonSerializer を利用します。
補足
XML形式でのクラスのシリアライズ、デシリアライズはこちらの記事を参照してください。

プログラム: JsonSerializer を利用する方法

.NET Core 3.0 以降 .NET 5 以降の場合は、JsonSerializerを利用できシンプルに実装できます。

UI

下図のフォームを作成します。

コード

以下のコードを記述します。
(フォームのコード)
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;
    }
  }
}
MyInfo.cs (情報格納クラスのコード)
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)]ボタンをクリックします。実体参照でない文字列で出力結果が表示されます。

プログラム: DataContractJsonSerializer を利用する方法

.NET FrameworkではJsonSerilizerが無いため、ここで紹介するDataContractJsonSerializerを利用するか、Newtonsoft.Json を利用します。

プロジェクト設定

新規のWindowsフォームアプリケーションプロジェクトを作成します。アセンブリの参照に、System.Runtime.Serializationを追加します。

UI

下図のフォームをデザインします。


コントロール名は以下の通りです。
  • ID欄のテキストボックス: textBox_ID
  • Name欄のテキストボックス: textBox_Name
  • Output欄のテキストボックス: textBox_Output
  • Serializeボタン: button1
  • DeSerializeボタン: button2
  • Clearボタン: button3

コード

以下のコードを実装します。
InfoClass.cs (情報格納クラスのコード)
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属性を付与します。

FormMain.cs (メインフォームクラスのコード)
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の内容からクラスのインスタンスを作成しメンバ(プロパティに)格納された値を画面に表示できます。

このページのキーワード
  • C#
  • JSON
  • クラスオブジェクトのシリアライズ
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2011-03-24
改訂日: 2025-03-23
Copyright © iPentec all rights reserverd.