😸
C#でJavaScriptみたいに簡単にJSONを使う方法
こんなことない?
- 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を使うときも便利
dynamic
でjson使えばいいんじゃないの?
全部- コード補完、効かないよ?
- エラーは基本全部ランタイムエラーになるよ
- コンパイル時に確認できないから
- REST APIとかで安全に使いたいって時には向いてない
C#では用途によってJSONの使い方が2種類ある
-
A.手間がかかるけど安全にチェックする使い方
- 検索すると良く出てくる方法
- 事前に型を定義してシリアライズ・デシリアライズ
- さくっと使う用じゃない
-
B.簡単だけどしっかりチェックしない使い方
- 今回の方法
- そもそもJSONがシンプル、とか、スクリプト的にJSONつかう、とか、APIのうち1~2種類しかつかわん、とかに向いてる
- 安心・安全につかいたいという用途には向いてない
Discussion
Visual StudioにはJSONから型を作成する便利機能があったりします。
AとBの中間あたりの方法として使えるかと。
JSON を .NET オブジェクトとして読み取る方法 (逆シリアル化)