C#でJSONのシリアライズ・デシリアライズをする方法


Pythonでは、JSONのシリアライズ・デシリアライズは以下のように行いますが  
C#ではどのようにすればよいですか？

[code]

    import json
    
    dict = {"test":{"test1":{"test2":"aaa"}}}
    dictDump = json.dumps(dict) #シリアライズ
    dictLoads = json.loads(dictDump) #デシリアライズ
    print(dictLoads["test"]["test1"]["test2"])
    
    #結果：aaa
    
[/code]

ちょっと調べた感じだと、C#とPythonの文法が違いすぎて理解できませんでした…。




C#は他のモダンな言語よりもJSONに優しくないイメージがあります。  
コメントのアドバイスのように、クラスを理解してJSONの構造をパースすることがC#でJSONを扱う一般的な方法です。  
クラスを作成して[DataContractJsonSerializer](https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer)を使うと.NET
Framework純正の環境のみでシリアライズ/デシリアライズできます。

サードパーティーのライブラリを使用可能な環境ならば[Json.NET](https://www.newtonsoft.com/json)を使う方法もあります。

ちなみに「なんで数行のJSON使うだけでクラス作らなきゃいけないんだ！」「私はただDictionaryをJSONにしたいだけなんだ…」というズボラな私は[DynamicJson](https://archive.codeplex.com/?p=dynamicjson)を使ったりもします。(サードパーティ製のライブラリです)  
nugetでライブラリをインストールする方法は割愛しますが、JSONとdynamicなオブジェクトを比較的短いコードで相互置換できます。  
以下はサンプルコードです。  
(入力補完とコンパイル時のチェックが効かず癖のあるdynamic型と匿名クラスを使いまくるとC#の良さをスポイルする気がしますが…)

参考資料: [C#でJSONを扱う方法まとめ](https://dev.classmethod.jp/articles/c-sharp-
json/#toc-19)

[code]

    using Codeplex.Data;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // DynamicJson ver 1.2.0.0 で動作するコード
    
                // JsonをdynamicオブジェクトにParse
                dynamic j1 = DynamicJson.Parse(@"{""Greetings"":""Hello World!""}");
                Console.WriteLine(j1.Greetings);            // Hello World!
                dynamic n1 = DynamicJson.Parse(@"{""test"":{""test1"":{""test2"":""aaa""}}}");
                Console.WriteLine(n1.test.test1.test2);     // aaa
    
                // 匿名クラスをParse
                dynamic j2 = DynamicJson.Parse(DynamicJson.Serialize(new { Greetings = "Hello World!!" }));
                Console.WriteLine(j2.Greetings);            // Hello World!!
                dynamic n2 = DynamicJson.Parse(DynamicJson.Serialize(new { test = new { test1 = new { test2 = "aaa" } } }));
                Console.WriteLine(n2.test.test1.test2);     // aaa
    
                // 余談: DictionaryをParse
                dynamic j3 = DynamicJson.Parse(DynamicJson.Serialize(new Dictionary<string, string> { { "Greetings", "Hello World!!!" } }));
                Console.WriteLine(j3[0].Value);             // Hello World!!!
    
                Console.Read();
            }
        }
    }
    
[/code]




C#は他のモダンな言語よりもJSONに優しくないイメージがあります。  
コメントのアドバイスのように、クラスを理解してJSONの構造をパースすることがC#でJSONを扱う一般的な方法です。  
クラスを作成して[DataContractJsonSerializer](https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.serialization.json.datacontractjsonserializer)を使うと.NET
Framework純正の環境のみでシリアライズ/デシリアライズできます。

サードパーティーのライブラリを使用可能な環境ならば[Json.NET](https://www.newtonsoft.com/json)を使う方法もあります。

ちなみに「なんで数行のJSON使うだけでクラス作らなきゃいけないんだ！」「私はただDictionaryをJSONにしたいだけなんだ…」というズボラな私は[DynamicJson](https://archive.codeplex.com/?p=dynamicjson)を使ったりもします。(サードパーティ製のライブラリです)  
nugetでライブラリをインストールする方法は割愛しますが、JSONとdynamicなオブジェクトを比較的短いコードで相互置換できます。  
以下はサンプルコードです。  
(入力補完とコンパイル時のチェックが効かず癖のあるdynamic型と匿名クラスを使いまくるとC#の良さをスポイルする気がしますが…)

参考資料: [C#でJSONを扱う方法まとめ](https://dev.classmethod.jp/articles/c-sharp-
json/#toc-19)

[code]

    using Codeplex.Data;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // DynamicJson ver 1.2.0.0 で動作するコード
    
                // JsonをdynamicオブジェクトにParse
                dynamic j1 = DynamicJson.Parse(@"{""Greetings"":""Hello World!""}");
                Console.WriteLine(j1.Greetings);            // Hello World!
                dynamic n1 = DynamicJson.Parse(@"{""test"":{""test1"":{""test2"":""aaa""}}}");
                Console.WriteLine(n1.test.test1.test2);     // aaa
    
                // 匿名クラスをParse
                dynamic j2 = DynamicJson.Parse(DynamicJson.Serialize(new { Greetings = "Hello World!!" }));
                Console.WriteLine(j2.Greetings);            // Hello World!!
                dynamic n2 = DynamicJson.Parse(DynamicJson.Serialize(new { test = new { test1 = new { test2 = "aaa" } } }));
                Console.WriteLine(n2.test.test1.test2);     // aaa
    
                // 余談: DictionaryをParse
                dynamic j3 = DynamicJson.Parse(DynamicJson.Serialize(new Dictionary<string, string> { { "Greetings", "Hello World!!!" } }));
                Console.WriteLine(j3[0].Value);             // Hello World!!!
    
                Console.Read();
            }
        }
    }
    
[/code]

