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

标签 c# json xamarin json.net

我正在从 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/

最佳答案

其实很简单。不要使用 var,而是在你的 JObject 上使用 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 间接派生自 JToken,它实现了 IDynamicMetaObjectProvider .正是该接口(interface)允许 dynamic 工作。

关于c# - 将 JObject 转换为动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36566999/

相关文章:

c# - 生成大文档后 IIS 内存使用不会恢复正常

c# - 如何拥有动态 DataTemplateSelector

c# - 身份:为什么 user.roles 是空的?

android - 如何在 Xamarin Android (API 16 - 19) 上启用 TLSv1.1+?

java - 为 Xamarin Android 库将 Java 移植到 C#

c# - 如何使用游标检索所有使用 TweetSharp 的 Twitter 用户?

java - 当查询父级时,子级也被获取,Hibernate

asp.net - 使用 JQuery 和 JSON 来使用 Asp.net 服务器端异步 Web 方法

ios - 使用 AFNetworking 3.0 在 URL 正文中发送 JSON 数据

android - 将 Activity 添加到后退堆栈时,如何使 Android AppCompat 工具栏中的文本居中?