使用JsonProperty对JSON进行Model属性绑定
我受到我方和客户之间协议的约束,使用包含破折号的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
,因此映射不起作用。
出了什么问题?
在尝试将请求参数绑定到模型时,ASP.NET的默认模型绑定程序不会将JsonPropertyAttribute
考虑在内(它不能,因为它不知道JsonPropertyAttribute
和JsonPropertyAttribute
的其余部分)。 鉴于您的场景(属性名称在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; } }