繁体   English   中英

如何使用JSON文件中生成的JsonProperty Name = name来访问相应C#类中的单个元素

[英]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);

笔记:

演示在这里摆弄。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM