JSON 文字列を C# オブジェクトに変換する

Fil Zjazel Romaeus Villegas 2023年1月30日 2022年2月3日
  1. Newtonsoft.Json を使用して JSON 文字列を C# オブジェクトに変換する
  2. JavaScript Serializer を使用して JSON 文字列を C# オブジェクトに変換する
  3. JSON 文字列を C# オブジェクトコード例に変換する
JSON 文字列を C# オブジェクトに変換する

このチュートリアルでは、2つの異なる方法を使用して JSON 文字列を C# オブジェクトに変換する方法を示します。

1つ目は Newtonsoft.Json ライブラリを使用し、2つ目は JavaScriptSerializer を使用します。どちらの方法も似ていますが、構文が少し異なり、異なる参照が必要です。

Newtonsoft.Json を使用して JSON 文字列を C# オブジェクトに変換する

Newtonsoft.Json ライブラリは、.NET で一般的に使用される JSON フレームワークです。このライブラリは、パッケージをソリューションにインストールした後に利用できます。以下のコマンドで.NETCLI を使用して、パッケージをインストールできます。

> dotnet add package Newtonsoft.Json --version 13.0.1

JSON 文字列は、オブジェクトタイプに対して有効な JSON 文字列である限り、任意のタイプの C# オブジェクトに変換できます。これは、文字列を逆シリアル化し、指定されたタイプ(T)にキャストし、入力 JSON 文字列を提供することによって行われます。

JsonConvert.DeserializeObject<T>(json_string);

JavaScript Serializer を使用して JSON 文字列を C# オブジェクトに変換する

JSON 文字列を C# オブジェクトに変換する古いオプションは JavaScriptSerializer です。Newtonsoft.Json ソリューションほど高速ではありませんが、それでも十分に利用できます。この方法を使用するには、プロジェクトに System.Web.Extensions.dll への参照を追加する必要があります。

参照を追加するには、以下の手順に従います。

  • ソリューションエクスプローラーに移動します
  • 参照を右クリックします
  • Add Reference をクリックします
  • 左側の Assemblies タブをクリックします
  • System.Web.Extensions.dll ファイルを見つけて、OK をクリックします。

JavaScriptSerializer は、JSON 文字列と型を逆シリアル化するだけでよいという点で Newtonsoft.Json メソッドと同様に機能します。

JavaScriptSerializer().Deserialize<T>(json_string)

JSON 文字列を C# オブジェクトコード例に変換する

以下のコード例は、JsonConvert.DeserializeObject<T> 関数と JavaScriptSerializer 関数の両方を使用して、JSON 文字列を任意のタイプの C# オブジェクトに変換する方法を示しています。この例では、文字列を整数を含むリストオブジェクト(List<Int32>)と、プログラムで指定したカスタムクラスに変換しています。

using Newtonsoft.Json; 
using System.Data;
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace JSON_To_Object_Example
{
    class Program
    {
        static void Main(string[] args)
        {
            //Declare the JSON Strings
            string list_str = "[1, 2, 3, 9, 8, 7]";
            string custom_class_str = "{ \"Name\":\"John Doe\",\"Age\":21,\"Birthday\":\"2000-01-01T00:00:00\"}";
            
            // ----- Newtonsoft Method -----
            //Deserialize the string by specifying the object type
            List<Int32> list_converted_ns = JsonConvert.DeserializeObject<List<Int32>>(list_str);
            
            //Print the contents of the newly converted List object to the Console.
            Console.WriteLine("Converted List - Newtonsoft: " + String.Join(", ", list_converted_ns) + "\n");
           
            //The same can be done for any type of C# object, including custom classes. Just change the specified Type.
            Custom_Class class_converted_ns = JsonConvert.DeserializeObject<Custom_Class>(custom_class_str);   
            Console.WriteLine("Converted Class - Newtonsoft:");     
            PrintPropreties(class_converted_ns);
            
            Console.WriteLine("\n\n");
            
            // ----- JavaScriptSerializer Method -----  
            //Deserialize the string by specifying the object type         
            List<Int32> list_converted_js = new JavaScriptSerializer().Deserialize<List<Int32>>(list_str);
            Console.WriteLine("Converted List - JavaScriptSerializer: " + String.Join(", ", list_converted_js) + "\n");
            
            Custom_Class class_converted_js = new JavaScriptSerializer().Deserialize<Custom_Class>(custom_class_str);
            Console.WriteLine("Converted Class - JavaScriptSerializer:");
            PrintPropreties(class_converted_js);
            Console.ReadLine(); 
           
        }

        public class Custom_Class
        {
        	//Custom Class created for the purposes of this tutorial
            public string Name { get; set; }
            public int Age { get; set; }
            public DateTime Birthday { get; set; }
        }

        public static void PrintPropreties(object obj)
        {
            //Uses the System.Component Model to read each property of a class and print its value
            foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
            {
                string name = descriptor.Name;
                object value = descriptor.GetValue(obj);
                Console.WriteLine("{0}: {1}", name, value);
            }
        }
    }
}

このコードは、コンマで結合された整数リストと、変換されたカスタムクラス内のすべてのプロパティを出力します。どちらの方法でも同じ出力が生成されることがわかります。

出力:

Converted List - Newtonsoft: 1, 2, 3, 9, 8, 7

Converted Class - Newtonsoft:
Name: John Doe
Age: 21
Birthday: 01/01/2000 12:00:00 am



Converted List - JavaScriptSerializer: 1, 2, 3, 9, 8, 7

Converted Class - JavaScriptSerializer:
Name: John Doe
Age: 21
Birthday: 01/01/2000 12:00:00 am

関連記事 - Csharp JSON

関連記事 - Csharp Object