😸

C#でJavaScriptみたいに簡単にJSONを使う方法

2024/11/13に公開1

こんなことない?

  • C#でJSONを使おうとするとめちゃくちゃ手間がかかる方法がでてくる
  • いちいち型を定義しないと使えないの?
  • JavaScriptみたいに簡単にJSON使えないの?

JavaScriptみたいに使う方法あるよ

dynamic + Json.NET(Newtonsoft.Json)ライブラリを使う場合
// lang=json
var json = """
	{
		"name":"json",
		"number": 123,
		"list": [
			"a",
			"b",
			"c"
		]
	}
	""";
dynamic jsonnetdata = Newtonsoft.Json.JsonConvert.DeserializeObject(json);

Console.WriteLine($"""
	jsonnetdata: {jsonnetdata}
	name: { jsonnetdata.name }
	number: { jsonnetdata.number }
	list[0]: { jsonnetdata.list[0] }
	""");

/* output

jsonnetdata: {
  "name": "json",
  "number": 123,
  "list": [
    "a",
    "b",
    "c"
  ]
}
name: json
number: 123
list[0]: a

*/
  • いちいち型を定義する必要ないよ
  • .[]でアクセスできるよ
  • 綺麗に成形して出力してくれるよ
  • メジャーなライブラリのJson.NET(Newtonsoft.Json)を使うパターンだよ
追加ライブラリなしでやる場合
dynamic systemtextjsondata = System.Text.Json.Nodes.JsonNode.Parse(json);

Console.WriteLine($"""
	systemtextjsondata: {systemtextjsondata}
	name: { systemtextjsondata["name"] }
	number: { systemtextjsondata["number"] }
	list[0]: { systemtextjsondata["list"][0] }
	""");
  • 標準ライブラリのSystem.Text.Jsonを使う
  • .アクセスできない
  • 代わりに["prop"]みたいなインデックスアクセスになる

もう少し詳しい説明

dynamicとはなんぞや

dynamic jsonnetdata = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
  • C#は静的型付けでも動的型付けでもなく「部分的に動的な静的型付け」らしい
    • ややこしいね
  • このややこしい原因は「dynamic」があるから
    • 通称 「dynamic
  • dynamicこういうJSONのためにあるようなもの
    • あとCOMを使うときも便利

https://learn.microsoft.com/ja-jp/dotnet/csharp/advanced-topics/interop/using-type-dynamic

https://ufcpp.net/study/csharp/sp4_dynamic.html

全部dynamicでjson使えばいいんじゃないの?

  • コード補完、効かないよ?
  • エラーは基本全部ランタイムエラーになるよ
    • コンパイル時に確認できないから
  • REST APIとかで安全に使いたいって時には向いてない

C#では用途によってJSONの使い方が2種類ある

  • A.手間がかかるけど安全にチェックする使い方
    • 検索すると良く出てくる方法
    • 事前に型を定義してシリアライズ・デシリアライズ
    • さくっと使う用じゃない
  • B.簡単だけどしっかりチェックしない使い方
    • 今回の方法
    • そもそもJSONがシンプル、とか、スクリプト的にJSONつかう、とか、APIのうち1~2種類しかつかわん、とかに向いてる
    • 安心・安全につかいたいという用途には向いてない

Discussion

YuneKichiYuneKichi

Visual StudioにはJSONから型を作成する便利機能があったりします。
AとBの中間あたりの方法として使えるかと。

JSON を .NET オブジェクトとして読み取る方法 (逆シリアル化)

  • Visual Studio 2022 を使用して、必要なクラスを自動的に生成します。
    • 逆シリアル化する必要がある JSON をコピーします。
    • クラス ファイルを作成し、テンプレート コードを削除します。
    • [編集] > [形式を選択して貼り付け] > [JSON をクラスとして貼り付ける] を選択します。