如何在运行时为JSON对象选择要序列化的属性
本文关键字:选择 序列化 属性 对象 JSON 运行时 | 更新日期: 2023-09-27 17:59:50
我有一个具有几个属性的对象:
public class Contacts
{
[JsonProperty]
public string Name { get; set; }
[JsonProperty]
public string City { get; set; }
[JsonProperty]
public string State { get; set; }
[JsonProperty]
public string CompanyType { get; set; }
[JsonProperty]
public string Url { get; set; }
[JsonProperty]
public string PKey { get; set; }
[JsonProperty]
public string SubscriptionDate { get; set; }
}
在我的web服务中,这个对象的数组被序列化,并使用Newtonsoft中的方法作为JSON提供给客户端
context.Response.Write(JsonConvert.SerializeObject(new { ContactsArray = contactsArray }));
我想更改我的服务,这样客户端就可以指定他们想要序列化的字段,这样如果他们将请求发送为:
http://myservice.com?fields=Name,City,State
只有名称、城市和州将被连载,但我不知道如何在飞行中做到这一点。
我读过关于ShouldSerialzeProperty()
方法的文章,但我不知道应该在该方法中检查什么。
我提出的解决方案包括使用反射来获取对象上的属性列表,并将用户未列出的属性值更改为null:
string[] fields = context.Request.QueryString["Fields"].Split(',');
string[] properties = typeof(Contacts).GetProperties().Select(r => r.Name).ToArray();
fields = properties.Where(r => !fields.Contains(r)).ToArray();
foreach (string field in fields)
{
foreach (Contacts item in contactsArray)
{
item.GetType().GetProperty(field).SetValue(item, null)
}
}
我不确定使用反射是否是最佳实践,但我想写这篇文章,这样无论我如何更改数据对象,它都能工作。
然后,我在数据对象中使用ShouldSerializeProperty()
方法来检查该值是否为null。如果为null,则不序列化该属性。例如,对于城市地产:
public bool ShouldSerializeCity() { return !(City == null); }
[JsonProperty]
public string City { get; set; }