[英]How do I use the generated JsonProperty Name = name from JSON file to access a single element in a corresponding C# Class
如何使用(生成的)JsonProperty Name =来自JSON文件的名称来访问相应C#类中的单个元素? 这是我想做的……
我有一个Xamarin“经典” Newtonsoft应用程序,在其中将JSON文件加载到C#类MagicTime
。
这是我课程的第一部分-这是newtonsoft网站使用我的JSON文件自动生成的
public partial class MagicTime
{
[JsonProperty("Accel Delay")]
public long AccelDelay { get; set; }
[JsonProperty("Accel Period")]
public long AccelPeriod { get; set; }
[JsonProperty("Alt DT Step")]
public long AltDtStep { get; set; }
[JsonProperty("Beep On Command")]
public bool BeepOnCommand { get; set; }
[JsonProperty("Bunt Step")]
public long BuntStep { get; set; }
[JsonProperty("Bunt Timeout")]
这就是如何加载/反序列化loadp是包含JSON文件内容的字符串变量的瞬间
MagicTime MT = JsonConvert.DeserializeObject<MagicTime>(loadp );
这很好用,在应用程序中,我修改了某些数据元素的值,例如,看上面的内容– MT.AccelDelay = 21;
然后,我反转该过程并写出/序列化我
这项工作也是如此。
现在,我有一个新要求,可以使用JsonProperty名称访问相应的C#数据项
在上面的示例中,我想使用[JsonProperty("Accel Delay")]
访问相应的c#元素MT.AccelDelay
。
我已经看到了将JSON字符串加载到JObject
来执行此操作的示例,但我没有看到没有(我可以看到) JObject
您可以为此目的使用Newtonsoft的ContractResolver
,因为它定义了Json.NET如何从c#对象映射到JSON对象。
首先,定义以下扩展方法:
public static partial class JsonExtensions
{
static readonly IContractResolver defaultResolver = new JsonSerializer().ContractResolver;
public static T GetJsonPropertyValue<T>(object obj, string propertyName, IContractResolver resolver = null)
{
resolver = resolver ?? defaultResolver;
var contract = resolver.ResolveContract(obj.GetType());
if (contract is JsonObjectContract objectContract)
{
var property = objectContract.Properties.GetClosestMatchProperty(propertyName);
if (property == null)
throw new JsonException(string.Format("Unknown property {0}", propertyName));
return (T)property.ValueProvider.GetValue(obj);
}
throw new JsonException(string.Format("Invalid contract {0}", contract));
}
}
现在,您可以执行以下操作:
var accelDelay = JsonExtensions.GetJsonPropertyValue<long>(MT, "Accel Delay");
如果您事先不知道类型,则可以执行以下操作:
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay");
如果您使用的是骆驼壳,请执行以下操作:
var resolver = new CamelCasePropertyNamesContractResolver();
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay", resolver);
笔记:
如果传入的obj
映射到JSON对象以外的其他对象(例如,数组或基元),则GetJsonPropertyValue()
将引发异常。 如果该属性是仅设置的,它也会抛出。
如果您需要一种发现给定类型的所有JSON属性名称的方法,请参阅从类中获取JSON属性名称的列表以用于查询字符串 ,尤其是此答案 。
演示在这里摆弄。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.