如何使用JSON文件中生成的JsonProperty Name=Name访问相应C#类中的单个元素
如何从JSON文件中使用(生成的)JsonProperty Name=Name来访问相应C#类中的单个元素? 这就是我要做的 我有一个Xamarin“classic”Newtonsoft应用程序,其中我将一个JSON文件加载到一个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
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,“加速延迟”,解析器);
注:
- 如果传入的
映射到JSON对象以外的对象(例如数组或原语),则obj
将引发异常。如果仅设置了属性,它也将抛出GetJsonPropertyValue()
- 如果需要一种方法来发现给定类型的所有JSON属性名,请参阅
演示小提琴。非常感谢,这回答了我的问题,我也需要设置值,但使用此GetValue执行相应的设置值方法并不困难