Я пытаюсь использовать JSON.NET в качестве сериализатора по умолчанию в стеке WebAPI 2. Я реализовал JsonMediaTypeFormatter, в котором я использовал сериализатор JSON.NET для сериализации/десериализации данных и создал JsonContentNegotiator для использования этого формата. Все работает отлично, за исключением запросов OData - если я добавлю [Queryable] метаданные из метода действия, тогда объект ответа не содержит никакой информации метаданных, только список объектов.
Небольшой пример. Мой метод действий:
[Queryable]
public async Task<PageResult<RuleType>> GetRuleType(ODataQueryOptions<RuleType> options)
{
var ret = await _service.ListRuleTypesAsync(options);
return new PageResult<RuleType>(
ret,
Request.GetNextPageLink(),
Request.GetInlineCount());
}
Если я использую сериализацию по умолчанию OData и вызываю некоторый запрос по типу Rule (например - .../odata/RuleType?$inlinecount=allpages&$skip=0&$top=1
), я получаю классический ответ OData с информацией метаданных и свойством count:
odata.metadata ".../odata/$metadata#RuleType"
odata.count "2"
value
0 {
Id: 1
Name: "General"
Code: "General"
Notes: null
}
(некоторые поля пропущены, но у меня есть свойство Notes с нулевым значением)
Но если я добавлю JsonContentNegotiator
с JsonMediaTypeFormatter
в качестве сериализатора - я получаю только список объектов:
[
{
"Id": 1,
"Name": "General",
"Code": "General"
}
]
(здесь нет поля для комментариев из-за NullValueHandling.Ignore
)
Даже больше. Если я удалю атрибут [Queryable]
в методе действия - я получаю следующий результат:
{
"Items": [
{
"Id": 1,
"Name": "General",
"Code": "General"
}
],
"Count": 2
}
В этом случае я получил Count, но все равно метаданных здесь нет. А также имена свойств ответа odata полностью отличаются от значений по умолчанию.
Мой разум взрывается. Я просто хочу использовать JSON.NET в качестве своего сериализатора в любой части моего веб-приложения (из-за сильных ограничений). Как я могу это сделать?