Динамический против JObject для десериализации JSON - PullRequest
0 голосов
/ 29 мая 2019

Допустим, у меня есть следующая строка:

 string MyString = @"{""name"":""John"",""url"":""https://www.john.com""}";

И я могу десериализовать его двумя способами, такими как:

JObject jobj = (JObject)JsonConvert.DeserializeObject(MyString);
dynamic jobj2 = JsonConvert.DeserializeObject(MyString);

Когда я делаю GetType для обоих объектов, я получаю оба:

Newtonsoft.Json.Linq.JObject

Тем не менее, когда я регистрирую jobj2.name, я получаю John , но когда я регистрирую jobj.name, я получаю:

Newtonsoft.Json.Linq.JObject' does not contain a definition for 'name' and no extension method 'name' accepting a first argument of type 'Newtonsoft.Json.Linq.JObject'

И должен называть это как jobj ["name"]

В чем причина разного синтаксиса, поскольку оба являются JObject?

1 Ответ

2 голосов
/ 29 мая 2019

Причина в том, что JObject (точнее, один из его базовых классов) реализует IDynamicMetaObjectProvider.Этот интерфейс позволяет объектам настраивать способ разрешения выражений dynamic, а не просто отражать их над открытыми членами.Так же работает ExpandoObject.

...