【问题标题】:Prevent Serialization of Created ActionResult防止创建的 ActionResult 的序列化
【发布时间】:2018-04-11 08:22:03
【问题描述】:

假设我有一个异步 web api 2 控制器方法返回一个 Created 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 属性仍在序列化中。

【问题讨论】:

    标签: c# json serialization asp.net-web-api2


    【解决方案1】:

    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

    【讨论】:

    • 谢谢,这正是我一直在寻找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 2014-06-06
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多