假设我有以下字符串:
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,使用不同语法的原因是什么?
答案 0 :(得分:2)
原因是JObject
(或更确切地说是其基类之一)实现了 IDynamicMetaObjectProvider
。该接口允许对象自定义dynamic
表达式的解析方式,而不仅仅是反映其公共成员。 ExpandoObject
的工作方式也是如此。