防止创建的 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 应该比设置 ShouldSerializeShouldDeserialize 委托更简单且性能略高。

  • 使用 nameof 避免硬编码 属性 名称。

  • 检查被序列化的类型是否继承自 Item 似乎是明智的,以防稍后将名为 ItemDescriptions 的 属性 添加到某个不相关的类型。

  • 您总是可以将 属性 标记为 [JsonIgnore] - 除非该类型位于某个外部库中且无法修改。

工作示例 .Net fiddle