我想找到有条件有,在我的.NET的WebAPI项目中删除从我DataContract序列属性的最佳方法。 在我的API,我想允许用户指定他们希望返回的字段。
例如,假设我希望我的API返回下面的类的实例。
public class Car
{
public int Id { get; set; }
public string Year { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string Color { get; set; }
}
但是,而不是请求整个对象,API调用想要的ID,发现只有使野外。 因此,返回JSON会
{ "Id": 12345, "Make": "Ford"}
而不是整个对象。
是否存在与DataContract串行的方式,我可以有条件地添加和删除我的回报对象的属性?
**编辑我已经看了看IgnoreDefault财产,我不相信它会做正是我需要的。 问题是,我要包括,不排除他们是否拥有数据不一定基于API请求属性。
是否有某种方式挂接到反序列化过程并跳过某些属性? 我可以做一些定制的合同?
如果你正在使用DataContractSerializer
(或者,在这种情况下, DataContractJsonSerializer
),你可以使用DataMember(EmitDefaultValue = false)]
装饰类。 通过这种方式,你可以设置你不想序列化到它们的默认值(即属性null
字符串,0为整数等等),他们将无法进行。
如果你正在使用ASP.NET Web API,那么你应该知道,默认JSON序列是不DataContractJsonSerializer
(DCJS),但JSON.NET代替。 所以,除非你明确地配置您的JsonMediaTypeFormatter
使用DCJS,你需要另一个属性来获得相同的行为( JsonProperty
,其DefaultValueHandling
属性)。
下面只代码序列化这是该汽车对象分配这两个部件,同时使用串行器。 请注意,您可以删除的属性之一,如果你只使用其中的一个。
public class StackOverflow_12465285
{
[DataContract]
public class Car
{
private int savedId;
private string savedYear;
private string savedMake;
private string savedModel;
private string savedColor;
[DataMember(EmitDefaultValue = false)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public int Id { get; set; }
[DataMember(EmitDefaultValue = false)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Year { get; set; }
[DataMember(EmitDefaultValue = false)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Make { get; set; }
[DataMember(EmitDefaultValue = false)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Model { get; set; }
[DataMember(EmitDefaultValue = false)]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
public string Color { get; set; }
[OnSerializing]
void OnSerializing(StreamingContext ctx)
{
this.savedId = this.Id;
this.savedYear = this.Year;
this.savedMake = this.Make;
this.savedModel = this.Model;
this.savedColor = this.Color;
// Logic to determine which ones to serialize, let's say I only want Id, Make; so make all others default.
this.Color = default(string);
this.Model = default(string);
this.Year = default(string);
}
[OnSerialized]
void OnSerialized(StreamingContext ctx)
{
this.Id = this.savedId;
this.Year = this.savedYear;
this.Make = this.savedMake;
this.Model = this.savedModel;
this.Color = this.savedColor;
}
}
public static void Test()
{
Car car = new Car { Id = 12345, Make = "Ford", Model = "Focus", Color = "Red", Year = "2010" };
JsonSerializer js = new JsonSerializer();
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
js.Serialize(sw, car);
Console.WriteLine("Using JSON.NET: {0}", sb.ToString());
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(Car));
dcjs.WriteObject(ms, car);
Console.WriteLine("Using DCJS: {0}", Encoding.UTF8.GetString(ms.ToArray()));
}
}