DotNet Core Web Api中的Json.Net反序列化

时间:2017-09-18 18:38:40

标签: c# json.net .net-core json-deserialization asp.net-core-webapi

TLDR; 无法使用Json.net反序列化器将查询字符串数据解析为对象模型。

长版: 我在dotnet core 2.0中使用Newtonsoft.Json的DefaultContractResolver作为Json序列化程序;

[Route("api/[controller]")]
public class ValuesController : Controller
{
    [HttpGet]
    public Core.Data.Models.Request.DataSourceRequestModel Get(Core.Data.Models.Request.DataSourceRequestModel req)
    {
        return req;
    }
}

在web api控制器中,我正在使用模型;

public sealed class DataSourceRequestModel
{
    [JsonProperty(PropertyName = "start")]
    public int Start { get; set; }
    [JsonProperty(PropertyName = "limit")]
    public int Limit { get; set; }
    [JsonProperty(PropertyName = "filter")]
    public ICollection<DataSourceRequestFilterModel> Filters { get; set; }
    [JsonProperty(PropertyName = "sort")]
    public ICollection<DataSourceRequestSortModel> Sorts { get; set; }

    public DataSourceRequestModel()
    {
        Limit = 25;
    }
}
public class DataSourceRequestFilterModel
{
    [JsonProperty(PropertyName = "property")]
    public string Property { get; set; }
    [JsonProperty(PropertyName = "operator")]
    public string Operator { get; set; }
    [JsonProperty(PropertyName = "value")]
    public string Value { get; set; }
}
public class DataSourceRequestSortModel
{
    [JsonProperty(PropertyName = "property")]
    public string Property { get; set; }
    [JsonProperty(PropertyName = "direction")]
    public string Direction { get; set; }
}

DataSourceRequestModel是;

_dc:1505755748815
page:1
start:99
limit:163
sort:[{"property":"Name","direction":"ASC"}]
filter:[{"property":"Code","value":"","operator":"eq"},{"property":"Name","value":"Ucretli","operator":"eq"}]

我正在使用此查询调用控制器; http://localhost:9417/api/values/?_dc=1505751693766&page=1&start=99&limit=163&filter=%5B%7B%22Property%22%3A%22Code%22%2C%22Value%22%3A%22%22%2C%22Operator%22%3A%22eq%22%7D%2C%7B%22property%22%3A%22Name%22%2C%22value%22%3A%22%5Cu00fccretli%22%2C%22operator%22%3A%22eq%22%7D%5D

基本上,我将此值作为查询字符串发送;

{
    "start": 99,
    "limit": 163,
    "filter": null,
    "sort": null
}

结果,我得到了这个;

MyModel

Json.net反序列化程序无法解析过滤器和排序属性,只是忽略它们。即使我更改属性名称,这次它也不会返回空值,但是我再次获得空数组。

导致这个问题的任何想法?

提前谢谢。

编辑1 :在DataSourceRequestModel中,我都尝试过List和DataSourceRequestFilterModel []数组更改但仍然没有成功。

编辑2 :如需进一步参考,我将分享我找到的解决方案。正如dbc 2在下面提到的那样,dotnet核心不使用Json.Net进行复杂的模型绑定,因此模型中的属性保持为null。因此,您必须创建并使用自己的自定义模型绑定器,详细信息请参见此处; http://www.dotnetcurry.com/aspnet-mvc/1368/aspnet-core-mvc-custom-model-binding

再次感谢所有参与的人。

0 个答案:

没有答案