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

如何使用JSON文件中生成的JsonProperty Name=Name访问相应C#类中的单个元素,c#,json.net,C#,Json.net,如何从JSON文件中使用(生成的)JsonProperty Name=Name来访问相应C#类中的单个元素? 这就是我要做的 我有一个Xamarin“classic”Newtonsoft应用程序,其中我将一个JSON文件加载到一个C#类MagicTime 这是我的类的第一部分——它是由newtonsoft网站使用我的JSON文件自动生成的 public partial class MagicTime { [JsonProperty("Accel Delay")] public l

如何从JSON文件中使用(生成的)JsonProperty Name=Name来访问相应C#类中的单个元素? 这就是我要做的

我有一个Xamarin“classic”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")]
MagicTime MT = JsonConvert.DeserializeObject<MagicTime>(loadp );
这就是如何加载/反序列化一个瞬间,其中loadp是包含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")]
MagicTime MT = JsonConvert.DeserializeObject<MagicTime>(loadp );
MagicTime MT=JsonConvert.DeserializeObject(loadp);
这个很好用 在应用程序中,我修改一些数据元素的值,例如 综上所述——MT.AccelDelay=21

然后,我反转该过程并将I写入/序列化输出

那也行

现在我有了一个新的需求,即使用JsonProperty名称访问相应的C#数据项

在上面的例子中,我想使用
[JsonProperty(“Accel Delay”)]
访问相应的c#元素
MT.AccelDelay

我看到过一些例子,其中JSON字符串被加载到
JObject
中来实现这一点,但在我的例子中没有(我可以看到)
JObject
您可以使用Newtonsoft实现这一目的,因为它定义了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));
    }
}
公共静态部分类JsonExtensions
{
静态只读IContractResolver defaultResolver=new JsonSerializer().ContractResolver;
公共静态T GetJsonPropertyValue(对象对象obj,字符串propertyName,IContractResolver解析器=null)
{
解析器=解析器??默认解析器;
var contract=resolver.ResolveContract(obj.GetType());
if(合同为JsonObjectContract objectContract)
{
var property=objectContract.Properties.GetClosestMatchProperty(propertyName);
if(属性==null)
抛出新的JsonException(string.Format(“未知属性{0}”,propertyName));
return(T)property.ValueProvider.GetValue(obj);
}
抛出新的JsonException(string.Format(“无效契约{0}”,契约));
}
}
现在你可以做:

var accelDelay = JsonExtensions.GetJsonPropertyValue<long>(MT, "Accel Delay");
var-accelDelay=JsonExtensions.GetJsonPropertyValue(MT,“加速延迟”); 如果您事先不知道类型,您可以:

var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay");
var-accelDelay=JsonExtensions.GetJsonPropertyValue(MT,“加速延迟”); 如果您使用的是驼峰式套管,请执行以下操作:

var resolver = new CamelCasePropertyNamesContractResolver();
var accelDelay = JsonExtensions.GetJsonPropertyValue<object>(MT, "Accel Delay", resolver);
var resolver=新的CamelCasePropertyNamesContractResolver();
var-accelDelay=JsonExtensions.GetJsonPropertyValue(MT,“加速延迟”,解析器);
注:

  • 如果传入的
    obj
    映射到JSON对象以外的对象(例如数组或原语),则
    GetJsonPropertyValue()
    将引发异常。如果仅设置了属性,它也将抛出

  • 如果需要一种方法来发现给定类型的所有JSON属性名,请参阅


演示小提琴。

非常感谢,这回答了我的问题,我也需要设置值,但使用此GetValue执行相应的设置值方法并不困难