将JObject转换为动态对象

时间:2016-04-12 07:56:08

标签: 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/

2 个答案:

答案 0 :(得分:16)

实际上很容易。而不是在ITEM_PIPELINES = { 'scrapy_taskeme.pipelines.ScrapyExampleComPipeline': 300 } 上使用var使用dynamic,您就可以了:

JObject

来自你的片段:

dynamic do = myObject.MyDynamicProp;

string name = do.Name;

为什么会有效:正如Richard所解释的那样,dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}"); string name = d.MyDynamicProp.Name; Console.WriteLine(name); // writes MyName 间接来自实现IDynamicMetaObjectProviderJObject。正是该界面允许JToken工作。

答案 1 :(得分:0)

在android中创建一个linker.xml文件 和BuildAction来链接描述

然后粘贴以下代码

<?xml version="1.0" encoding="UTF-8" ?>
<linker>
  <assembly fullname="Mono.Android">
    <type fullname="Xamarin.Android.Net.AndroidClientHandler" preserve="all" />
  </assembly>
    
    
    <assembly fullname="mscorlib"></assembly>
        
    <assembly fullname="System.Core"></assembly> 
        <assembly fullname="System.Runtime.Serialization"> </assembly> 
    <assembly fullname="Newtonsoft.Json"></assembly>
 \
    <assembly fullname="System.Reactive.Linq"></assembly> 
    <assembly fullname="System.Reactive.Interfaces"></assembly> 
 
    <assembly fullname="System.Xml"></assembly> 
        
   <assembly fullname="Xamarin.Forms.Core"></assembly>
</linker>