2015-06-26 45 views
0

我有幾個屬性的對象:如何選擇在運行時爲JSON對象序列化哪些屬性?

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的方法提供給客戶端的JSON:

context.Response.Write(JsonConvert.SerializeObject(new { ContactsArray = contactsArray }));

我想改變我的服務,使客戶可以指定哪些字段,他們希望序列化,所以如果他們把他們的要求爲:

http://myservice.com?fields=Name,City,State

只有名稱,城市和州將被序列化,但我不知道如何在飛行中執行此操作。

我讀了關於ShouldSerialzeProperty()方法,但我不知道該在方法中應該檢查什麼。

回答

0

我想出了一個解決方案包括使用反射來獲取我的對象的屬性的列表,並且不改變用戶列出空屬性的值:

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()方法來檢查值是否爲空。如果它爲空,則該屬性不會被序列化。例如,對於City Property:

public bool ShouldSerializeCity() { return !(City == null); } 
[JsonProperty] 
public string City { get; set; } 
相關問題