HttpClient-PostAsJson不发送空属性

时间:2019-03-21 08:04:31

标签: c# asp.net-core .net-core

我通过以下方式将对象发布到另一个API上

HttpClient.PostAsJsonAsync(uri, content)

我的内容发送时缺少属性。

我的内容类型为 字典<字符串,对象>

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

当我发布该对象时,它消失为

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

是否可以使用 PostAsJson 方法发布空属性?

2 个答案:

答案 0 :(得分:1)

PostAsJsonAsync仅用PostAsync调用JsonMediaTypeFormatter。该格式化程序,或更重要的是它的基类BaseJsonMediaTypeFormatter,创建了一个JsonContractResolver,它是Json.Net的IContractResolver,并控制是否以及如何将成员序列化为json。它会从IRequiredMemberSelector中调用JsonMediaTypeFormatter,以查看成员是否应该be serialized even it it's null

我认为您最好的选择是使用Json.Net序列化Dictionary,然后使用HttpClient发送字符串。像这样:

var json = JsonConvert.SerializeObject(content);
HttpCLient.PostAsync(uri, new StringContent(json, Encoding.UTF8, "application/json"));

答案 1 :(得分:1)

HttpClient没有$(document).ready(function() { $('#portfolioNavbar ul li a').click(function() { $(document).off("scroll"); $('#portfolioNavbar ul li a').each(function () { $(this).removeClass('active'); }) $(this).addClass('active'); var tghsh = $(this).attr('href').substring(1); var headerHeight = $('.portfolioi_left').outerHeight(); var winwid = $(window).width(); var doffset = $('#'+tghsh).offset().top-20; var doffset1 = $('#'+tghsh).offset().top-280; if(winwid <= 991) { doffset1 -= headerHeight; $('html, body').animate({scrollTop:doffset1},700); return false; } $('html, body').animate({scrollTop:doffset},700); return false; }); }); function onScroll(event){ var scrollPos = $(document).scrollTop(); $('#portfolioNavbar ul li a').each(function () { var currLink = $(this); var refElement = $(currLink.attr("href")); if (refElement.position().top <= scrollPos && refElement.position().top + refElement.height() > scrollPos) { $('#portfolioNavbar ul li a').removeClass("active"); currLink.addClass("active"); } else{ currLink.removeClass("active"); } }); }; 方法。这是an extension method由Microsoft.AspNet.WebApi.Client程序包添加的。它没有做任何特别困难的事情,它使用Json.NET将PostAsJsonAsync对象序列化为JSON。您可以通过几行来完成相同的操作:

content

默认情况下,Json.Net 序列化空属性。它将序列化字典中的所有项目,即使该项目的值为var json = JsonConvert.SerializeObject(someObject); var content = new StringContent(json, Encoding.UTF8, "application/json"); var result = await client.PostAsync(url, content);

您可以使用NullValueHandling属性忽略空属性:

null

这不会影响字典。您必须在序列化之前过滤掉包含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); 值的字典项