将JObject转换为动态对象

doo*_*man 7 c# json json.net xamarin

我从C#调用REST端点,我收到json,它被序列化为一个对象.此对象的一个​​属性是动态属性.动态属性的值在服务器站点上设置为匿名对象,如下所示:

myObject.MyDynamicProp = new { Id = "MyId2134", Name = "MyName" };
Run Code Online (Sandbox Code Playgroud)

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

{{
  "id": "MyId2134",
  "Name": "MyName"
}}
Run Code Online (Sandbox Code Playgroud)

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

var s = myObject.MyDynamicProp.Name;
Run Code Online (Sandbox Code Playgroud)

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

var s = myObject.MyDynamicProp["Name"].Value;
Run Code Online (Sandbox Code Playgroud)

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

var dyn = myObject.MyDynamicProp.ToObject<dynamic>();
Run Code Online (Sandbox Code Playgroud)

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

var s = myObject.MyDynamicProp.Name;
Run Code Online (Sandbox Code Playgroud)

更新......

我跑了以下

 dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}");
 string name = d.MyDynamicProp.Name;
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

 {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]
Run Code Online (Sandbox Code Playgroud)

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


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

Pat*_*man 16

实际上很容易.而不是使用var使用dynamic你的JObject,你将被罚款:

dynamic do = myObject.MyDynamicProp;

string name = do.Name;
Run Code Online (Sandbox Code Playgroud)

从您的片段:

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

Console.WriteLine(name); // writes MyName
Run Code Online (Sandbox Code Playgroud)

为什么这样做:正如理查德解释的那样,JObject间接地从JToken哪些工具中获取IDynamicMetaObjectProvider.这是允许dynamic工作的界面.

  • 为什么会这样:`JObject`间接来自`JToken`,它实现了[`IDynamicMetaObjectProvider`](https://msdn.microsoft.com/en-us/library/System.Dynamic.IDynamicMetaObjectProvider.aspx).正是这个界面允许`dynamic`工作. (4认同)
  • 感谢您的快速回复,但即使我使用动态而不是 var,当我调用该属性时,我也会收到“未知成员:名称”。 (2认同)