未知の 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
からの戻りは何だろうと次のコードで検証。
dynamic document = Newtonsoft.Json.JsonConvert.DeserializeObject( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); Console.WriteLine(((object)document).GetType().FullName); // Newtonsoft.Json.Linq.JObject
Newtonsoft.Json.Linq.JObject
になっていました。
プロパティを表示する
Newtonsoft.Json.Linq.JObject
は IDictionary<string, JToken?>
を実装しているので、Key と Value を foreach
で回せます。
Newtonsoft.Json.Linq.JObject document = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject( @"{ ""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
メソッドでプロパティを追加できます。
Newtonsoft.Json.Linq.JObject document = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); ((IDictionary<string, Newtonsoft.Json.Linq.JToken?>)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
メソッドでプロパティを削除できます。
Newtonsoft.Json.Linq.JObject document = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject( @"{ ""prop1"": ""value1"", ""prop2"": ""value2""}"); ((IDictionary<string, Newtonsoft.Json.Linq.JToken?>)document).Remove("prop1"); foreach (var m in document) Console.WriteLine($"key:{m.Key}, Value:{m.Value}"); // key:prop2, Value:value2 // と出力される
IDictionary<string, Newtonsoft.Json.Linq.JToken?>
を実装しているので特にキャストしなくても OK です。
document.Remove("prop1");