动态与JObject进行JSON反序列化

时间:2019-05-29 17:50:05

标签: c# json json-deserialization

假设我有以下字符串:

 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 个答案:

答案 0 :(得分:2)

原因是JObject(或更确切地说是其基类之一)实现了 IDynamicMetaObjectProvider。该接口允许对象自定义dynamic表达式的解析方式,而不仅仅是反映其公共成员。 ExpandoObject的工作方式也是如此。