2014-01-31 4 views
1

Мотивация по этому вопросу: Google JSON Style Guide, я хочу вставить немного логики логики сериализации в мой API для отдыха. Я использую WebAPI 2 и JSON.NET. Моя цель - обернуть «полезную нагрузку» моего ответа в поле «данные» основного ответа JSON, как описано в руководстве по стилю, включить поле apiVersion в каждом ответе и т. Д. Конечно, действия регулятора просто вернуться прямо ПОКО, и я хочу, чтобы изменить контейнер что они отправленное внутри, а не самих Pocos, так:Добавить «стандартные» поля JSON для сериализованных объектов в REST API

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

... такого рода вещи. Поэтому я предвижу вставлять небольшие бит стандартных данных в каждый ответ, прежде чем он перейдет через провод. Каков наилучший способ сделать это?

TIA.

ответ

5

Я считаю, что вы можете использовать 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); 
     } 
    } 
} 

с помощью атрибута, вы можете выбрать, чтобы применить его там, где вы хотите (весь контроллер, действие или только в качестве фильтра по умолчанию).

Примечание: У меня нет доступа к среде разработки на данный момент и не проверен фильтр. Если это не завершено, оно должно по крайней мере дать вам представление о том, как это можно сделать.

+0

Это все. для решения с манжетой, это было правильно на отметке! Благодарю. – user2403744

Смежные вопросы