Как отправить camelCase Json в C# Web Api для сопоставления свойств Pascal с ошибкой
В настоящее время я использую этот JsonFormatter для отправки клиенту данных на верблюде
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver();
WebApiConfig
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Web.Http;
namespace AlumCloud
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver();
}
}
}
Все работает отлично, мои данные получены на клиенте, как и ожидалось отлично.
Теперь пришло время начать отправку данных на сервер, и я использую
C# Web Api in the .NET platform.
Вот функция POST, в которую я пытаюсь отправить данные JSON Cased верблюда с одним объектом C#, для ясности я удалил большую часть кода.
Контроллер WebApi
namespace AlumCloud.Controllers
{
[Authorize]
public class HorizontalController : AlumCloudWebApiBaseController
{
public async Task<HttpResponseMessage> Post(Horizontal h)
{
string update = HttpContext.Current.Request.QueryString["a"];
int ownerID = 0; ;
HttpResponseMessage res = null;
InsertHorizontalHelper insertRes = null;
if (!int.TryParse(HttpContext.Current.Request.QueryString["id"], out ownerID))
{
return Request.CreateResponse(HttpStatusCode.NotFound, "Provide the id of the horizontal owner");
};
if (h.CompID < 1)
{
if (h.Sitelines.TopCompID > 0)
{
h.CompID = h.Sitelines.TopCompID;
};
}
switch (update)
{
Вот как выглядят Свойства Горизонтального объекта, они в Паскале.
C# Customer Object Я хочу отобразить свойства из JSON в C#
namespace CADDL.DataTransfer.Tables
{
[XmlType(Namespace = "urn:DataObjects")]
[XmlRoot(Namespace = "urn:DataObjects")]
[Serializable]
public class Horizontal : ColumnInfo, IHorizontal
{
[ColumnAttributes("ID", false, "int")]
public int ID { get; set; }
[ColumnAttributes("Position", false, "byte")]
public byte Position { get; set; }
[ColumnAttributes("Name", false, "string")]
public string Name { get; set; }
[ColumnAttributes("IsFiller", false, "bool")]
public bool IsFiller { get; set; }
[ColumnAttributes("HorizontalNote", false, "string")]
public string HorizontalNote { get; set; }
[ColumnAttributes("SizeID", false, "int")]
public int SizeID { get; set; }
[ColumnAttributes("WidthInches", false, "decimal")]
public decimal WidthInches { get; set; }
[ColumnAttributes("HeightInches", false, "decimal")]
Моя ошибка
{"message":"An error has occurred.","exceptionMessage":"Object reference not set to an instance of an object.","exceptionType":"System.NullReferenceException","stackTrace":" at AlumCloud.Controllers.HorizontalController.<Post>d__0.MoveNext() in D:\\Users\\Erik Little\\Documents\\visual studio 2015\\Projects\\AlumCloud\\AlumCloud\\Controllers\\CAD\\HorizontalController.cs:line 28\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"}
Мои вопросы к группе.
- Почему мой объект Horizontal C# всегда имеет значение null? Это потому, что JSON является верблюжьим, а свойства, которым он соответствует, - это паскаль?
- Должен ли преобразователь свойств из JSON в объект C# быть в одном и том же случае, чтобы установить значение?
- Какой глобальный способ исправить эту проблему, чтобы мне не нужно было добавлять настройки, устанавливаются в каждом новом контроллере Web Api?
Просто для ясности, атрибуты, которые вы видите в каждом свойстве, относятся к моему слою данных, поскольку при запросе данных они не используются в этом случае.
1 ответ
То, как объекты принимаются клиентом и обрабатываются на сервере, требует двух разных объектов, чтобы упростить жизнь, поэтому я создал папку с именем client request и, таким образом, нет конфликтов имен, с которыми я назвал класс Horizontal размер клиента HorizontalRequest, но с только свойствами, необходимыми для удовлетворения клиентов.
Объекты класса на сервере несколько больше, чем нужно для получения запроса JSON, поэтому, когда клиенты отправляют данные, когда объекты сервера в 20 раз больше, чем нужно, я просто создаю классы, такие как HorizontalRequest, без косточек, без атрибутов. Просто свойства.