【问题标题】:JSON to Model property binding using JsonPropertyJSON 到模型属性绑定使用 JsonProperty
【发布时间】:2017-02-03 08:44:52
【问题描述】:

我受我方和客户之间的协议的约束,可以使用包含破折号的 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 行设置断点,我可以看到调用到达,但请求未正确映射。

Name 包含我所期望的:requestName,但 RequestNumber 是 null,因此映射不起作用。

怎么了?

【问题讨论】:

  • 你也可以使用 ModelBinder,看看这个:stackoverflow.com/questions/33247992/…
  • 谢谢,但我不认为这是一个相关问题,因为我的模型实例确实到达了,只是(其中一个)映射失败了。如果我省略'-',一切都很好。
  • 当然,如果您省略“-”,它将正确到达,因为它将与您的模型上的名称相同。默认 ModelBinder 不区分大小写
  • 问题解决了吗?

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


【解决方案1】:

ASP.NET 的默认模型绑定器在尝试将请求参数绑定到模型时不考虑 JsonPropertyAttribute(它不能,因为它不知道 JsonPropertyAttribute 和 NewtonSoft 的其余部分。杰森)。鉴于您的情况(在 C# 中不是合法标识符的属性名称),实现您想要的唯一方法是通过读取 JsonPropertyAttributecustom model binder

如果您确实有合法标识符的属性名称(例如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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多