防止创建的 ActionResult 的序列化
Prevent Serialization of Created ActionResult
假设我有一个异步网络 api 2 控制器方法返回一个已创建的 ActionResult,例如:
return Created(new Uri(Request.RequestUri + "/" + Item.Id), Item);
Item
有一个 属性 ItemDescriptions
我想在响应时截断它。如何为这样的 Created Web Api 响应定义序列化?
我尝试创建一个自定义解析器,例如:
public class ItemContractResolver: CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.PropertyName == "ItemDescriptions")
{
property.ShouldSerialize = i => false;
property.ShouldDeserialize = i => false;
}
return property;
}
}
我后来在 Controller 构造函数中设置为:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new ItemContractResolver();
但不幸的是,这不起作用,ItemDescriptions
属性 仍在序列化。
JsonProperty.PropertyName
是 属性 的 序列化 名称。由于您继承自 CamelCasePropertyNamesContractResolver
,因此它将是 "itemDescriptions"
。
相反,检查 JsonProperty.UnderlyingName
这是基础成员或参数的 名称 :
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (typeof(Item).IsAssignableFrom(property.DeclaringType)
&& property.UnderlyingName == nameof(Item.ItemDescriptions))
{
property.Ignored = true;
}
return property;
}
备注-
设置 JsonProperty.Ignored
应该比设置 ShouldSerialize
和 ShouldDeserialize
委托更简单且性能略高。
使用 nameof
避免硬编码 属性 名称。
检查被序列化的类型是否继承自 Item
似乎是明智的,以防稍后将名为 ItemDescriptions
的 属性 添加到某个不相关的类型。
您总是可以将 属性 标记为 [JsonIgnore]
- 除非该类型位于某个外部库中且无法修改。
工作示例 .Net fiddle。
假设我有一个异步网络 api 2 控制器方法返回一个已创建的 ActionResult,例如:
return Created(new Uri(Request.RequestUri + "/" + Item.Id), Item);
Item
有一个 属性 ItemDescriptions
我想在响应时截断它。如何为这样的 Created Web Api 响应定义序列化?
我尝试创建一个自定义解析器,例如:
public class ItemContractResolver: CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.PropertyName == "ItemDescriptions")
{
property.ShouldSerialize = i => false;
property.ShouldDeserialize = i => false;
}
return property;
}
}
我后来在 Controller 构造函数中设置为:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new ItemContractResolver();
但不幸的是,这不起作用,ItemDescriptions
属性 仍在序列化。
JsonProperty.PropertyName
是 属性 的 序列化 名称。由于您继承自 CamelCasePropertyNamesContractResolver
,因此它将是 "itemDescriptions"
。
相反,检查 JsonProperty.UnderlyingName
这是基础成员或参数的 名称 :
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (typeof(Item).IsAssignableFrom(property.DeclaringType)
&& property.UnderlyingName == nameof(Item.ItemDescriptions))
{
property.Ignored = true;
}
return property;
}
备注-
设置
JsonProperty.Ignored
应该比设置ShouldSerialize
和ShouldDeserialize
委托更简单且性能略高。使用
nameof
避免硬编码 属性 名称。检查被序列化的类型是否继承自
Item
似乎是明智的,以防稍后将名为ItemDescriptions
的 属性 添加到某个不相关的类型。您总是可以将 属性 标记为
[JsonIgnore]
- 除非该类型位于某个外部库中且无法修改。
工作示例 .Net fiddle。