JSON.net Deserialization в Dotnet Core Web APIC#

Место общения программистов C#
Ответить
Anonymous
 JSON.net Deserialization в Dotnet Core Web API

Сообщение Anonymous »

TLDR; Can not parse querystring data to object model using Json.net deserializer.

Long version:
I'm using Newtonsoft.Json's DefaultContractResolver for Json serializer in dotnet core 2.0;

var mvc = services.AddMvc();
mvc.AddJsonOptions(options =>
{
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
options.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
});
< /code>

В веб -контроллере API я использую модель; < /p>

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

и dataSourcErequestModel IS; < /p>

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 Filters { get; set; }
[JsonProperty(PropertyName = "sort")]
public ICollection 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; }
}
< /code>

Я вызываю контроллер с этим запросом;
http: // localhost: 9417/api/values/? _dc = 1505751693766 & page = 1 & start = 99 & Limit = 163 & Filter =%5b%7b%22%22%3a%22code%22%2c%22 -Value%22%3a%22%2 2%2C%22Perator%22%3A%22EQ%22%7D%2C%7B%22PORTY%22%3A%22 -name%22%2C%22 Value%22%3A%22%5CU00FCCRETLI%22%2C%22%22%3A%22 EQ%22%7D%5D

По сути, я посылаю это значение как querystring; < /p>

_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"}]
< /code>

В результате я получаю это; < /p>

{
"start": 99,
"limit": 163,
"filter": null,
"sort": null
}
< /code>

json.net deserializer не может проанализировать фильтр и сортировки, просто игнорируя их. Даже если я изменяю имена свойств, на этот раз он не возвращает нулевые значения, но опять же, я получаю пустой массив. DataSourCeRequestFiltermodel [] Изменения массива и до сих пор не успешно. Как упомянуто здесь DBC2, Dotnet Core не использует json.net для сложной привязки модели, поэтому свойства в модели остаются нулевыми. Таким образом, вы должны создавать и использовать свои собственные привязки модели, подробно здесь;
http://www.dotnetcurry.com/aspnet-mvc/1 ... el-binding

Еще раз спасибо всем, кто есть.

Подробнее здесь: https://stackoverflow.com/questions/462 ... re-web-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»