2017-03-01 32 views
1

我的班级像下面如何忽略列表,如果值在C#是空

public class SubscriptionDetailModel 
{ 

    public SubscriptionDetailModel() 
    { 
     cap = new List<Subscriptioninfo>(); 
     filter = new List<Subscriptioninfofilter>(); 
     schedule = new List<SubscriptioninfoSchedule>(); 
    } 
    public List<Subscriptioninfo> cap { get; set; } 
    public List<Subscriptioninfofilter> filter { get; set; } 
    public List<SubscriptioninfoSchedule> schedule { get; set; } 

    [IgnoreDataMember] 
    public Nullable<int> SubscriptionID { get; set; } 
    public string Name { get; set; } 
} 

public class Subscriptioninfo 
{ 
    public int SubscriptionID { get; set; } 
    public Nullable<int> AccountID { get; set; } 
    public Nullable<int> SubscriptionCapID { get; set; } 
    public Nullable<int> LeadCapTypeId { get; set; } 
    public string LeadCapType { get; set; } 
    public string Name { get; set; } 
    public string SubscriptionDescription { get; set; } 
} 

public class Subscriptioninfofilter 
{ 
    public Nullable<int> SubscriptionFilterID { get; set; } 
    public Nullable<int> SubscriptionFilterTypeID { get; set; } 
    public string SubscriptionFilterTypeInputValue { get; set; } 
    public string SubscriptionFilterTypeName { get; set; } 
    public string SubscriptionFilterTypeOperator { get; set; } 
} 

public class SubscriptioninfoSchedule 
{ 
    public int SubscriptionScheduleId { get; set; } 
    public string DayOfWeek { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public Nullable<DateTime> ModifiedDate { get; set; } 
    public int TimeZoneCode { get; set; } 
} 

我的输出如下面的时间表

"response":"200","message":"Success","data":[{"cap":[],"filter":[],"schedule":[{"SubscriptionScheduleId":5,"DayOfWeek":"Thursday","StartTime":"2017-01-12T12:00:00","EndTime":"2017-01-12T20:30:00","CreatedDate":"2017-01-11T00:00:00","ModifiedDate":null,"TimeZoneCode":8}],"Name":null}]} 

现在的问题是如何去除“封顶”: [],“过滤器”:[]来自回应。 我们可以忽略数据成员,如果Public Nullable<int> SubscriptionID {get;set;}

但我不知道如何忽略像上面这样的列表。

我的结果应该是像下面

"response":"200","message":"Success","data":[{"schedule":[{"SubscriptionScheduleId":5,"DayOfWeek":"Thursday","StartTime":"2017-01-12T12:00:00","EndTime":"2017-01-12T20:30:00","CreatedDate":"2017-01-11T00:00:00","ModifiedDate":null,"TimeZoneCode":8}],"Name":null}]} 
+0

你使用的是Json.NET吗? –

+0

不,我不使用Json.NET –

回答

1

空列表是别的东西比与空值的属性。后者将被省略,首先不会。 (这就是为什么设置JSON.NET的NullValueHandling在这种情况下没用。)

'解决方案'是将空列表设置为null。然后JSON序列化程序将忽略它们。使用JSON.NET时的另一个解决方案是编写一个自定义序列化器,该序列化器排除序列化中的空列表。这两个在我看来都不理想。

0

如果您使用的是Newtonsoft json for serializer,那么将其包含在可能为空的类的顶部。

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 

否则您可以做的是将对象转换为JSON,您可以使用此设置。

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.NullValueHandling = NullValueHandling.Ignore; 
var myJson = JsonConvert.SerializeObject(myObject, settings); 
+0

正如我的答案所述,列表不为空。这是它不被排除的原因。 –

+0

你可以将对象设置为null,然后使用这个设置,它会省略空的东西。 –

+0

确实是我的答案。 –

1

如果您正在使用自定义的JSON序列,那么就很难提出另一种解决方案,比@PatrickHofman不同的建议,反正简单的答案是序列化前将属性null

SubscriptionDetailModel obj = //method to get required instance of SubscriptionDetailModel 
... 
obj.cap = obj.cap != null && obj.cap.Any() ? obj.cap : null; 
obj.filter = obj.filter != null && obj.filter.Any() ? obj.filter : null; 
//call to your serialize method 

如果您正在使用Json.NET再看看这里about conditional serializing

简单地说,如果你可以修改SubscriptionDetailModel类,然后添加方法如下:

public bool ShouldSerializecap() 
{ 
    return this.cap != null && this.cap.Any(); 
} 

public bool ShouldSerializefilter() 
{ 
    return this.filter != null && this.filter.Any(); 
} 
+0

如果使用JSON.NET,确实不错。如果不是,则设置为空是唯一的选择。 –

+0

@PatrickHofman设置为null或创建自定义序列化程序。我同意你的回答。 –

+0

'public bool ShouldSerializecap() { return this.cap!= null && this.cap.Any(); } 通过使用这个获取过滤器值cap被移除,但获取cap的值将返回**未将对象引用设置为对象的实例** 'var subscription = new SubscriptionDetailModel(); ...... subscriptionCapDetail.SubscriptionDescription = item。SubscriptionDescription; subscription.cap.Add(subscriptionCapDetail);' @MikhailNeofitov –