你可以使用Json.NET自带的
合同解析器来实现此目的。这样做将正确处理具有和不具有
[JsonProperty(string name)]
属性的属性,以及直接应用
命名策略或
数据契约属性的对象。
首先添加以下方法:
public static partial class JsonExtensions
{
static readonly IContractResolver defaultResolver = JsonSerializer.CreateDefault().ContractResolver;
public static object GetJsonProperty<T>(T obj, string jsonName, bool exact = false, IContractResolver resolver = null)
{
if (obj == null)
throw new ArgumentNullException(nameof(obj));
resolver = resolver ?? defaultResolver;
var contract = resolver.ResolveContract(obj.GetType()) as JsonObjectContract;
if (contract == null)
throw new ArgumentException(string.Format("{0} is not serialized as a JSON object", obj));
var property = contract.Properties.GetProperty(jsonName, exact ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase);
if (property == null)
throw new ArgumentException(string.Format("Property {0} was not found.", jsonName));
return property.ValueProvider.GetValue(obj);
}
}
现在你可以这样做:
var employee = new Employee
{
LastName = "last name",
};
Console.WriteLine("Value of {0} is {1}.", "emp_lname",
JsonExtensions.GetJsonProperty(employee, "emp_lname"));
如果您的应用程序默认使用驼峰式命名法进行JSON序列化,您可以像这样将CamelCasePropertyNamesContractResolver
传递给resolver
:
Console.WriteLine("Value of {0} is {1}.", "emp_lname",
JsonExtensions.GetJsonProperty(employee, "emp_lname", resolver : new CamelCasePropertyNamesContractResolver()));
如果您需要获取给定类型的所有JSON属性名称列表,请参见
从类中获取JSON属性名称列表以在查询字符串中使用。该链接提供了相关信息。
public static partial class JsonExtensions
{
public static string [] PropertyNames(Type type)
{
return PropertyNames(defaultResolver, type);
}
public static string [] PropertyNames(this IContractResolver resolver, Type type)
{
if (resolver == null || type == null)
throw new ArgumentNullException();
var contract = resolver.ResolveContract(type) as JsonObjectContract;
if (contract == null)
return new string[0];
return contract.Properties.Where(p => !p.Ignored).Select(p => p.PropertyName).ToArray();
}
}
演示 fiddle 在这里。
Name
而不是emp_fname
来访问它的值。 - Jawadvar pInfo = [EmployeeInstance].GetType().GetProperties().FirstOrDefault(p => p.GetCustomAttributes<JsonPropertyAttribute>().Any(at => at.PropertyName.Equals("emp_lname")));
- Jimi