如何在运行时为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()方法的文章,但我不知道应该在该方法中检查什么。

如何在运行时为JSON对象选择要序列化的属性

我提出的解决方案包括使用反射来获取对象上的属性列表,并将用户未列出的属性值更改为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; }