未知の 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");