c# - 如何将驼峰式 Json 发送到 C# Web Api 以匹配 Pascal 属性而不会出现错误

标签 c# json asp.net-web-api2 camelcasing pascalcasing

目前我正在使用这个 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.

这是我尝试使用一个 C# 对象将驼峰式 JSON 数据发布到的 POST 函数,为了清楚起见,我删除了大部分代码。

WebApi Controller

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)
            {

水平对象的属性是这样的,它们是 Pascal 大小写

C# 客户对象我想将属性从 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()"}

我对小组的问题是。

  1. 为什么我的 Horizo​​ntal C# 对象总是 null 是因为 JSON 是 Camel 大小写并且它匹配的属性是 Pascal 大小写?
  2. 从 JSON 到 C# 对象的属性映射器是否必须大小写相同才能设置值?
  3. 什么是解决此问题的全局方法,这样我就不必在每个新的 Web Api Controller 中添加属性设置?

为了清楚起见,您在每个属性上看到的属性都是针对我的数据层的,因为在请求数据时,它们不会在此实例中使用

最佳答案

客户端接收对象和在服务器上处理对象的方式需要两个不同的对象以使生活更轻松,因此我创建了一个名为 client request 的文件夹,因此没有名称冲突我将其命名为来自客户端大小 Horizo​​ntalRequest 的水平类,但仅具有满足客户端所需的属性。

服务器上的类对象比接收 JSON 请求所需的大一些,所以当客户端发送数据时服务器对象比需要的大 20 倍,我将只创建像 Horizo​​ntalRequest 这样的类,简单的,没有属性,只有属性。

关于c# - 如何将驼峰式 Json 发送到 C# Web Api 以匹配 Pascal 属性而不会出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065507/

相关文章:

javascript - 添加/删除 CSS 类属性以尊重不基于 Div id 的类

c++ - 为什么我不能使用 [] 运算符访问 nlohmann 的 C++ JSON 库中的数组?

iphone - iPhone中的异常抛出JSON支持程序

c# - 如何将 Automapper 与 Autofac 一起使用

OWIN 上的 CORS 和访问/token 导致 'Access-Control-Allow-Origin' 错误

asp.net-core - 使用 httpClient.postasync 进行 Web api 调用 .netcore

c# - 查找/消除重复字符串的方法

c# - 如何访问 JSON 字符串中的嵌套对象

c# - 解析字符串中的单个 XML 语句

python - 从scrapy中提取数据到数组中