加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将JObject转换为动态对象

发布时间:2020-12-15 18:20:02 所属栏目:百科 来源:网络整理
导读:我从C#调用REST端点,我收到json,它被序列化为一个对象.此对象的一个??属性是动态属性.动态属性的值在服务器站点上设置为匿名对象,如下所示: myObject.MyDynamicProp = new { Id = "MyId2134",Name = "MyName" }; 在客户端站点上,json序列化的动态属性值是一
我从C#调用REST端点,我收到json,它被序列化为一个对象.此对象的一个??属性是动态属性.动态属性的值在服务器站点上设置为匿名对象,如下所示:
myObject.MyDynamicProp = new { Id = "MyId2134",Name = "MyName" };

在客户端站点上,json序列化的动态属性值是一个包含以下值的JObject:

{{
  "id": "MyId2134","Name": "MyName"
}}

我希望能够访问这样的属性:

var s = myObject.MyDynamicProp.Name;

但它没有找到Name属性,而是我必须得到这样的值:

var s = myObject.MyDynamicProp["Name"].Value;

我尝试将JObject转换为这样的动态对象,但它返回JObject:

var dyn = myObject.MyDynamicProp.ToObject<dynamic>();

如何转换动态属性值,以便我可以直接调用其属性?

var s = myObject.MyDynamicProp.Name;

更新……

我跑了以下

dynamic d = JsonConvert.DeserializeObject("{"MyDynamicProp": {"id": "MyId2134","Name": "MyName"}}");
 string name = d.MyDynamicProp.Name;

这给了我以下错误:

{Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:    `Newtonsoft.Json.Linq.JObject' does not contain a definition for `MyDynamicProp'
  at Microsoft.Scripting.Interpreter.ThrowInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00027]

我想补充一点,这是一个Xamarin iOS项目,代码位于PCL库中.

我假设我的代码有问题,但看起来在Xamarin iOS项目中不可能使用动态类型.
https://developer.xamarin.com/guides/ios/advanced_topics/limitations/

解决方法

实际上很容易.而不是在你的JObject上使用var use dynamic,你会没事的:
dynamic do = myObject.MyDynamicProp;

string name = do.Name;

从您的片段:

dynamic d = JsonConvert.DeserializeObject("{"MyDynamicProp": {"id": "MyId2134","Name": "MyName"}}");
string name = d.MyDynamicProp.Name;

Console.WriteLine(name); // writes MyName

为什么会这样:正如Richard所解释的那样,JObject间接地从实现IDynamicMetaObjectProvider的JToken派生.正是那个允许动态工作的接口.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读