【问题标题】:Add 'standard' JSON fields to serialized objects in REST API将“标准”JSON 字段添加到 REST API 中的序列化对象
【发布时间】:2014-01-31 19:12:05
【问题描述】:

受此启发:Google JSON Style Guide,我想在我的其余 API 中插入一些自定义序列化逻辑。我正在使用 WebAPI 2 和 JSON.NET。我的目标是将我的响应的“有效负载”包装在主要 JSON 响应的“数据”字段中,如样式指南中所述,在每个响应中包含一个 apiVersion 字段,等等。当然,控制器操作只是返回直接的 POCO,我想修改发送它们的 容器,而不是 POCO 本身,所以:

{
  "id": "111",
  "apiVersion": "1.0",
  "data": {
    "kind": "monkey",
    "name": "manny",
    "age": "3"
  },
  "error": null
}

...那种东西。因此,我设想在每个响应通过网络之前将少量标准数据插入到每个响应中。完成此任务的最佳方法是什么?

TIA。

【问题讨论】:

    标签: json rest asp.net-web-api json.net


    【解决方案1】:

    我相信您可以使用ActionFilterAttribute 来实现这种行为。您首先需要创建一个类来表示您的包装响应(所有属性都是字符串,根据需要进行调整):

    public class WrappedJsonResponse
    {
        public string Id {get;set;}
        public string ApiVersion {get;set;}
        public object Data {get;set;}
        public string Error {get;set;}
    }
    

    ActionFilterAttribute 允许您在通过虚拟OnActionExecuted 方法执行操作后进行一些处理:

    public class WrappedJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext context)
        {
            // A POCO response will normally be wrapped in an ObjectContent
            var content = context.Response.Content as ObjectContent
    
            if(content != null)
            {
                // Create the WrappedJsonResponse object appropriately and
                // put the original result in the Data property
                content.Value = new WrappedJsonResponse { Data = content.Value };
                content.ObjectType = typeof(WrappedJsonResponse);
            }
        }
    }
    

    使用该属性,您可以选择将其应用到您想要的位置(整个控制器、仅操作或作为默认过滤器)。

    注意:我目前无法访问开发环境,也没有测试过过滤器。如果这不完整,它至少应该让您了解如何完成。

    【讨论】:

    • 就是这样。对于现成的解决方案,它是正确的!谢谢。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多