使用 JsonProperty 将 JSON 绑定到模型属性

Spi*_*kee 5 c# rest json asp.net-web-api2

我受我方和客户之间协议的约束,必须使用包含破折号的 json 参数。由于无法在 C# 中的属性名称中使用它,因此我需要映射到所需的属性。

我现在应该做什么:

为了方便起见,下面的代码被简化了。

模型

public class MyRequest
{
    [JsonProperty("request-number")]
    public string RequestNumber { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器

[HttpGet]
[Route("api/load-stuff")]
public Stuff LoadStuff([FromUri]MyRequest request)
{
    return BackEnd.LoadStuff(request);
}
Run Code Online (Sandbox Code Playgroud)

客户端调用API

上述控制器使用以下 uri 进行定位:

http://localhost:12345/api/load-stuff?request-number=X123&name=requestName
Run Code Online (Sandbox Code Playgroud)

我的问题

如果我在该行放置一个断点,BackEnd.LoadStuff我可以看到调用到达,但请求未正确映射。

名称包含我期望的内容:requestName,但 RequestNumber 是null,因此映射不起作用。

出了什么问题?

Ian*_*emp 2

ASP.NET 的默认模型绑定器在尝试将请求参数绑定到模型时不会考虑这一点JsonPropertyAttribute(它不能,因为它不知道JsonPropertyAttributeNewtonSoft.Json 的其余部分)。给定您的场景(属性名称在 C# 中不是合法标识符),实现您想要的唯一方法是通过读取JsonPropertyAttribute.

如果您的属性名称确实是合法标识符(例如request_number),那么您可以使用这些命名属性创建一个请求模型,然后将其映射到具有正确命名属性的单独模型,例如:

public class MyController : ApiController
{
    [HttpGet]
    [Route("api/load-stuff")]
    public Stuff LoadStuff([FromUri]MyRequest request)
    {
        return BackEnd.LoadStuff(request.ToMyPrettyRequest());
    }
}

public class MyRequest
{
    public string request_number { get; set; }

    public string name { get; set; }

    MyPrettyRequest ToMyPrettyRequest()
    {
        return new MyPrettyRequest
        {
            RequestNumber = request_number,
            Name = name,
        };
    }
}

public class MyPrettyRequest
{
    public string RequestNumber { get; set; }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)