【问题标题】:How do I use the generated JsonProperty Name = name from JSON file to access a single element in a corresponding C# Class如何使用 JSON 文件中生成的 JsonProperty Name = name 来访问相应 C# 类中的单个元素
【发布时间】:2019-09-16 20:50:52
【问题描述】:

如何使用(生成的)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;

然后我反转这个过程并把 /Serialize I 写出来

那也行。

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

上面的例子我想用[JsonProperty("Accel Delay")]来访问对应的c#元素MT.AccelDelay

我已经看到了将 JSON 字符串加载到 JObject 以执行此操作的示例,但不是我的情况(我可以看到)JObject

【问题讨论】:

    标签: c# json.net


    【解决方案1】:

    您可以为此目的使用 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);
    

    注意事项:

    演示小提琴here.

    【讨论】:

    • 非常感谢,这回答了我的问题,我也需要设置值,但使用此 GetValue 进行相应的 SetValue 方法并不难
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多