访问名称中带点的属性
我试图反序列化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