Проблема с сериализацией данных с использованием JSON.Net
Я использую планировщик Kendo в своем приложении для извлечения данных из моей базы данных с помощью веб-API. Я создал функцию Web Api и просто жестко запрограммировал некоторые данные, чтобы планировщик Kendo мог читать мои данные. Вот мой код для функции Api:
[Route("api/v1/Events/GetPersonalEvents", Name = "ApiEventsGetPersonalEvents")]
[HttpGet]
public DataSourceResult GetPersonalEvents([System.Web.Http.ModelBinding.ModelBinder(typeof(WebApiDataSourceRequestModelBinder))]DataSourceRequest request)
{
var q = new ViewModels.Events.EventViewModel();
q.Id = 1;
q.Title = "This is a test";
q.Start = DateTime.Now;
q.End = DateTime.Now.AddHours(1);
q.Description = "Test entry";
var list = new List<ViewModels.Events.EventViewModel>();
list.Add(q);
return list.ToDataSourceResult(request);
}
Планировщик кендо ничего не отображал в календаре. Используя Fiddler, я смог увидеть, что Kendo Scheduler вызывает мой API, а мой API возвращает данные. Вот отправка JSON:
{
"data":[
{
"id":1,
"title":"This is a test",
"description":"Test entry",
"isAllDay":false,
"start":"2016-11-18T15:31:33.1173519-08:00",
"end":"2016-11-18T16:31:33.1178524-08:00",
"startTimezone":null,
"endTimezone":null,
"recurrenceRule":null,
"recurrenceException":null
}
],
"total":1,
"aggregateResults":null,
"errors":null
}
Казалось, все работает нормально. После дальнейшего расследования я наконец выяснил свою проблему. В моемglobal.asax.cs
файл у меня есть такие строки:
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
Это заставляет JSON.Net автоматически преобразовывать имена C # в имена, дружественные к Javascript (например,Title
становитсяtitle
, Description
становитсяdescription
и тд ...), чего я и хочу. Однако, кендо, по-видимому, требует, чтобы имена были похожи на C # (например,Title
вместоtitle
). Я подтвердил это, комментируя эти три строки в моемglobal.asax.cs
файл и все работало нормально.
Итак, я переключил свое внимание на мою модель представления. Я украсил свои свойства сJsonProperty
атрибут, указывающий конкретное имя. Тем не менее, он все еще сериализуется как строчные имена. Вот вид модели кода:
public class EventViewModel : ISchedulerEvent
{
[JsonProperty(PropertyName = "Id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "Title")]
public string Title { get; set; }
[JsonProperty(PropertyName = "Description")]
public string Description { get; set; }
[JsonProperty(PropertyName = "IsAllDay")]
public bool IsAllDay { get; set; }
[JsonProperty(PropertyName = "Start")]
public DateTime Start { get; set; }
[JsonProperty(PropertyName = "End")]
public DateTime End { get; set; }
[JsonProperty(PropertyName = "StartTimezone")]
public string StartTimezone { get; set; }
[JsonProperty(PropertyName = "EndTimezone")]
public string EndTimezone { get; set; }
[JsonProperty(PropertyName = "RecurrenceRule")]
public string RecurrenceRule { get; set; }
[JsonProperty(PropertyName = "RecurrenceException")]
public string RecurrenceException { get; set; }
}
Так что теперь у меня нет идей. Итак, есть ли способ заставить Json.Net правильно сериализовать мои имена, ТОЛЬКО для этого одного метода, или есть какой-то другой атрибут, который я могу использовать в моей модели представления для правильной сериализации имен, или в Kendo есть настройка, которая позволил бы Кендо использовать формат случая верблюда?