未知の Json を扱う一連の記事をまとめた記事を書きました。
こちらの記事で一気読みできます。
■ 【過去】 .NET Framework 時代
Json を扱う際には .NET Framework 時代には Json.NET というライブラリがよく使われていました。
このライブラリの Newtonsoft.Json.JsonConvert.DeserializeObject
メソッドで未知の Json を扱うことができました。
メソッドの定義は次のようになっています。
public static object? DeserializeObject(string value);
使う際には、dynamic
型変数に代入して使っていた方も多いのではないでしょうか?
次のように
dynamic document = Newtonsoft.Json.JsonConvert.DeserializeObject( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); Console.WriteLine(document.prop1); // value1 と出力される Console.WriteLine(document.prop2); // value2 と出力される
実際にはこの際、DeserializeObject
からの戻りは何だろうと次のコードで検証した記事を以前に書きました。
結論としては、Newtonsoft.Json.Linq.JObject
になっていました。まあ、そのまま使えばいいのですが、C# には実はその他に dynamic の中身として使う System.Dynamic.ExpandoObject
クラスがいます。今回はこの型を使ってみましょう。
型の指定、型の確認
dynamic document = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); Console.WriteLine(((object)document).GetType().FullName); // System.Dynamic.ExpandoObject
System.Dynamic.ExpandoObject
になりました。
プロパティを表示する
普通に dynamic っぽく。
dynamic document = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); Console.WriteLine(document.prop1); // value1 と出力される Console.WriteLine(document.prop2); // value2 と出力される
System.Dynamic.ExpandoObject
は IDictionary<string, object>
を実装しているので、Key と Value を foreach
で回せます。
System.Dynamic.ExpandoObject document = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); foreach (var m in document) Console.WriteLine($"key:{m.Key}, Value:{m.Value}"); // key:prop1, Value:value1 // key:prop2, Value:value2 // と出力される
プロパティを追加する
IDictionary
の Add
メソッドでプロパティを追加できます。
System.Dynamic.ExpandoObject document = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); ((IDictionary<string, object>)document).Add("prop3", "value3"); foreach (var m in document) Console.WriteLine($"key:{m.Key}, Value:{m.Value}"); Console.WriteLine($"key:prop3, Value:{((dynamic)document).prop3}"); // key:prop1, Value:value1 // key:prop2, Value:value2 // key:prop3, Value:value3 // key:prop3, Value:value3 // と出力される
dynamic
型にして次のようにしてもできます。
((dynamic)document).prop3 = "value3";
プロパティを削除する
IDictionary
の Remove
メソッドでプロパティを削除できます。
System.Dynamic.ExpandoObject document = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Dynamic.ExpandoObject>( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); ((IDictionary<string, object>)document).Remove("prop1"); foreach (var m in document) Console.WriteLine($"key:{m.Key}, Value:{m.Value}"); // key:prop2, Value:value2 // と出力される
IDictionary<string, object>
を実装しているので特にキャストしなくても OK です。
document.Remove("prop1", out var _);