【发布时间】:2018-11-19 19:09:39
【问题描述】:
我有如下所示的 Json。
这实际上是一个复杂得多的对象,但这段摘录说明了我的问题。
我正在考虑缩小生成的 Json 响应的大小。目前正在使用 MVC 中的标准 JsonResult 生成,
有没有办法让 JSonResult 不流式传输值为 0 的属性?如果可能的话,它会大大缩小我的 json 响应!这反过来会使解析速度更快。
{
"firstValue": 0.2000,
"secondValue": 30.80,
"thirdValue": 0.0,
"fourthValue": 30.80,
"fifthValue": 0.0
}
所以我实际上只会将下面的响应传回给调用者:
{
"firstValue": 0.2000,
"secondValue": 30.80,
"fourthValue": 30.80,
}
我看到答案指向我在我的 Web api 中使用 App_Start,但我使用的是没有应用启动的 Kestrel - 这是由 Service Fabric 托管的
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener(
serviceContext =>
new KestrelCommunicationListener(
serviceContext,
(url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");
return new WebHostBuilder()
.UseKestrel(options => { options.Listen(IPAddress.Any, 8081); })
.ConfigureServices(
services => services
.AddSingleton(serviceContext)
.AddSingleton(new ConfigSettings(serviceContext))
.AddSingleton(new HttpClient())
.AddSingleton(new FabricClient()))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseStartup<Startup>()
.UseSerilog(_log, true)
.UseUrls(url)
.Build();
}))
};
}
【问题讨论】:
-
在使用
.Where(x => x.Value != 0)返回数据之前查询数据时,您似乎应该能够做到这一点 -
我不想那样做,因为这是一个具有大量属性的对象,这将是一个巨大的 where 子句!
-
我明白了。在这种情况下,您可能会发现 newtonsoft 的条件序列化很有趣:newtonsoft.com/json/help/html/ConditionalProperties.htm 尽管我相信您仍然必须定义要以一种或另一种方式有条件地排除哪些属性。我很想看看是否有人有更优雅的方式来实现这一目标。希望这会有所帮助
-
您使用的是哪个版本的asp.net-mvc?对于 JSON 序列化,早期版本使用
JavaScriptSerializer,如 here,但 ASP.Net Core 使用 Json.NET,如 here。答案会因序列化程序而异。 -
我正在使用 ASPNet 核心 - 我从运行 Web API 的服务结构主机内部运行它 - 我在服务中有包 Microsoft.AspNetCore.Mvc
标签: c# json asp.net-mvc asp.net-core asp.net-core-mvc