JSON to Model属性绑定使用JsonProperty

时间:2017-02-03 08:44:52

标签: c# json rest asp.net-web-api2

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

我现在做的事情:

  

为方便起见,下面的代码已经过简化。

模型

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

    [JsonProperty("name")]
    public string Name { get; set; }
}

控制器

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

从客户端调用API

上述控制器的目标是使用此uri:

http://localhost:12345/api/load-stuff?request-number=X123&name=requestName

我的问题

如果我在BackEnd.LoadStuff行放置断点,我可以看到呼叫到达,但请求未正确映射。

  

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

出了什么问题?

1 个答案:

答案 0 :(得分:2)

ASP.NET的默认模型绑定程序在尝试将请求参数绑定到模型时不考虑JsonPropertyAttribute(它不能,因为它不知道JsonPropertyAttribute和剩下的NewtonSoft.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; } } ),那么您可以使用这些命名属性创建请求模型,然后将其映射到具有正确命名属性的单独模型,例如:

{{1}}