Csharp/C#教程:访问名称中带点的属性分享


访问名称中带点的属性

我试图反序列化JSON。 我的根对象有一个属性“en.pickthall”。 我使用动态类型来读取我的JSON。 我以为我可以放弃“。” 在属性中,因为它是一个本地JSON文件,但是必须有一些方法来访问这样的属性

var result = App_Code.FileIOHelper.ReadFromDefaultFile("ms-appx:///Assets/en.pickthall.json"); dynamic stuff = JsonConvert.DeserializeObject(result); foreach(var x in stuff.(en.pickthall)) //Tried this intellisense didn't like it { } 

C#没有任何引用标识符的方法。 如果它不是有效的标识符,那么您唯一的选择就是reflection。

但是,JSON反序列化器返回的对象可能会更改标识符以使它们在C#中可用 – 您可能希望枚举所有属性以检查是否是这种情况。 具有索引器的动态对象也可能是一种解决方案(允许例如stuff["en.pickthall"] )。

另一种方法是更改​​序列化程序映射属性的方式。 例如,Newtonsoft.Jsoft允许您使用IContractResolver自定义它。 更换它很容易. 以这种方式更多的C#-sane。

您可以创建一个根类来反序列化并使用JsonProperty

 public class Root { [JsonProperty(PropertyName = "en.pickthall")] public object EnPickthall { get; set; } public Root() {} public Root(en_pickthall) { this.EnPickthall = en_pickthall; } } 

然后你可以打电话

 Root stuff = JsonConvert.DeserializeObject(result); foreach(var x in stuff.EnPickthall) { } 

你可以序列化不是动态的,而是序列化到JObject ,然后通过访问你的属性

 JObject stuff = JsonConvert.DeserializeObject(Jsonstring); var x = stuff.Value("my.property") 

使用动态对象和NewtonSoft.Json:

 dynamic json = JValue.Parse(result); int Opens = Convert.ToInt32(json.opens); int Clicks = Convert.ToInt32(json.clicks); string State = json.state; 

我知道你说你使用动态类型进行JSON反序列化,但我只想指出有一个.NET RESTful客户端,它也支持静态模型定义。 对于您或其他任何在C#REST调用中搜索属性名称中的点问题答案时发生此响应的人。

截至新发布的RestSharp 106.1.0 (我的意思是这个版本因为刚刚添加了这个支持),它可以通过DeserializeAs属性处理名称中带点的重命名属性。 一个例子是当我使用以下模型调用ElasticSearch API进行_cat调用时:

 public class CatResponse { public string index { get; set; } ... [DeserializeAs(Name = "docs.count")] public string docscount { get; set; } } 

实际上,现在将docs.count属性反序列化为docscount:

  var resource = $"_cat/indices/{indexPattern}?format=json&pretty=true"; var request = new RestRequest(resource, Method.GET); var response = client.Execute>(request); 

这种支持是开箱即用的 ,不需要使用Newtonsoft.Json.JsonSerializer,我也听说过这是一个可能解决这个问题但我无法工作的解决方案。

上述就是C#学习教程:访问名称中带点的属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/984132.html

(0)
上一篇 2021年12月20日
下一篇 2021年12月20日

精彩推荐