HttpClient - PostAsJson не отправляет нулевые свойства - PullRequest
0 голосов
/ 21 марта 2019

Пока я отправляю свой объект в другой API с

HttpClient.PostAsJsonAsync(uri, content)

Мой контент отправляется с отсутствующими свойствами.

Мой тип контента: Словарь <строка, объект>

"limit": 10, 
"offset": 0,
"sort": null,
"order": null

Когда я публикую этот объект, он исчезает как

"limit": 10, 
"offset": 0,

Можно ли также публиковать нулевые свойства с помощью метода PostAsJson ?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

HttpClient не имеет PostAsJsonAsync метода.Это метод расширения , добавленный пакетом Microsoft.AspNet.WebApi.Client.Он не делает ничего особенно сложного, он использует Json.NET для сериализации объекта content в JSON.Вы можете сделать то же самое с парой строк:

var json = JsonConvert.SerializeObject(someObject);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var result = await client.PostAsync(url, content);

По умолчанию Json.Net выполняет сериализацию нулевых свойств.Он будет сериализовать все элементы в словаре, даже если его значение равно null

Вы можете игнорировать нулевые свойства с помощью свойства NullValueHandling :

var settings=new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
var json = JsonConvert.SerializeObject(someObject,settings);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var result = await client.PostAsync(url, content);

Thisне повлияет на словари.Вам придется отфильтровать элементы словаря, которые содержат null значений, перед сериализацией

1 голос
/ 21 марта 2019

PostAsJsonAsync просто звонит PostAsync с JsonMediaTypeFormatter.Этот форматтер, или, более того, его базовый класс BaseJsonMediaTypeFormatter, создает JsonContractResolver, который является IContractResolver из Json.Net, и контролирует, если и как члены сериализуются в json.Он вызывает IRequiredMemberSelector из JsonMediaTypeFormatter, чтобы увидеть, должен ли член быть сериализован, даже если он нулевой .

Я думаю, вам лучше всего сериализовать Словарь с Json.Netа затем отправьте строку с помощью HttpClient.Вот так:

var json = JsonConvert.SerializeObject(content);
HttpCLient.PostAsync(uri, new StringContent(json, Encoding.UTF8, "application/json"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...