Exclude Zero Values when streaming to json with JsonResult in MVC
I have the Json shown below.
This is actually a far more complex object in reality, but this extract demonstrates my question.
I am looking at shrinking the size of the Json response being generated. This is currently being generated using the standard JsonResult in MVC,
Is there a way of getting JSonResult to not stream properties that have a value of 0? If that is possible, it would shrink my json response a lot! This in turn would make parsing faster.
{
"firstValue": 0.2000,
"secondValue": 30.80,
"thirdValue": 0.0,
"fourthValue": 30.80,
"fifthValue": 0.0
}
So I would only actually end up passing back the response below to the caller:
{
"firstValue": 0.2000,
"secondValue": 30.80,
"fourthValue": 30.80,
}
I have seen answers pointing me to using App_Start in my web api but I am using Kestrel which doesnt have an app start - this is being hosted by 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();
}))
};
}
c# json asp.net-mvc asp.net-core asp.net-core-mvc
|
show 2 more comments
I have the Json shown below.
This is actually a far more complex object in reality, but this extract demonstrates my question.
I am looking at shrinking the size of the Json response being generated. This is currently being generated using the standard JsonResult in MVC,
Is there a way of getting JSonResult to not stream properties that have a value of 0? If that is possible, it would shrink my json response a lot! This in turn would make parsing faster.
{
"firstValue": 0.2000,
"secondValue": 30.80,
"thirdValue": 0.0,
"fourthValue": 30.80,
"fifthValue": 0.0
}
So I would only actually end up passing back the response below to the caller:
{
"firstValue": 0.2000,
"secondValue": 30.80,
"fourthValue": 30.80,
}
I have seen answers pointing me to using App_Start in my web api but I am using Kestrel which doesnt have an app start - this is being hosted by 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();
}))
};
}
c# json asp.net-mvc asp.net-core asp.net-core-mvc
Seems like you should be able to do this when querying the data out before returning it with a.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
1
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions useJavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.
– dbc
Nov 19 '18 at 19:40
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17
|
show 2 more comments
I have the Json shown below.
This is actually a far more complex object in reality, but this extract demonstrates my question.
I am looking at shrinking the size of the Json response being generated. This is currently being generated using the standard JsonResult in MVC,
Is there a way of getting JSonResult to not stream properties that have a value of 0? If that is possible, it would shrink my json response a lot! This in turn would make parsing faster.
{
"firstValue": 0.2000,
"secondValue": 30.80,
"thirdValue": 0.0,
"fourthValue": 30.80,
"fifthValue": 0.0
}
So I would only actually end up passing back the response below to the caller:
{
"firstValue": 0.2000,
"secondValue": 30.80,
"fourthValue": 30.80,
}
I have seen answers pointing me to using App_Start in my web api but I am using Kestrel which doesnt have an app start - this is being hosted by 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();
}))
};
}
c# json asp.net-mvc asp.net-core asp.net-core-mvc
I have the Json shown below.
This is actually a far more complex object in reality, but this extract demonstrates my question.
I am looking at shrinking the size of the Json response being generated. This is currently being generated using the standard JsonResult in MVC,
Is there a way of getting JSonResult to not stream properties that have a value of 0? If that is possible, it would shrink my json response a lot! This in turn would make parsing faster.
{
"firstValue": 0.2000,
"secondValue": 30.80,
"thirdValue": 0.0,
"fourthValue": 30.80,
"fifthValue": 0.0
}
So I would only actually end up passing back the response below to the caller:
{
"firstValue": 0.2000,
"secondValue": 30.80,
"fourthValue": 30.80,
}
I have seen answers pointing me to using App_Start in my web api but I am using Kestrel which doesnt have an app start - this is being hosted by 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();
}))
};
}
c# json asp.net-mvc asp.net-core asp.net-core-mvc
c# json asp.net-mvc asp.net-core asp.net-core-mvc
edited Nov 20 '18 at 0:14
Paul
asked Nov 19 '18 at 19:09
PaulPaul
80531442
80531442
Seems like you should be able to do this when querying the data out before returning it with a.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
1
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions useJavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.
– dbc
Nov 19 '18 at 19:40
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17
|
show 2 more comments
Seems like you should be able to do this when querying the data out before returning it with a.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
1
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions useJavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.
– dbc
Nov 19 '18 at 19:40
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17
Seems like you should be able to do this when querying the data out before returning it with a
.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
Seems like you should be able to do this when querying the data out before returning it with a
.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
1
1
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions use
JavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.– dbc
Nov 19 '18 at 19:40
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions use
JavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.– dbc
Nov 19 '18 at 19:40
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17
|
show 2 more comments
2 Answers
2
active
oldest
votes
That's super easy. Just specify a value for DefaultValueHandling with the value Ignore.
As the description in that link says:
Ignore members where the member value is the same as the member's default value when serializing objects so that it is not written to JSON. This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, decimals and floating point numbers; and false for booleans). The default value ignored can be changed by placing the DefaultValueAttribute on the property.
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
add a comment |
As Kit suggested, you could use the DefaultValueHandling
behavior.
Besides, you can always custom your own ContractResolver
to solve such questions. Here's a version of using custom ContractResolver
to ignore default value:
public class IgnoreZeroContractResolver : DefaultContractResolver
{
public IgnoreZeroContractResolver( ){ }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
var shouldSerialize = true; // indicate should we serialize this property
var type = instance.GetType();
var pi = type.GetProperty(property.PropertyName);
var pv = pi.GetValue(instance);
var pvType = pv.GetType();
// if current value equals the default values , ignore this property
if (pv.GetType().IsValueType){
var defaultValue = Activator.CreateInstance(pvType);
if (pv.Equals(defaultValue)) { shouldSerialize = false; }
}
return shouldSerialize;
};
return property;
}
}
And now you can set your resover as the ContractResolver
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(o =>{
o.SerializerSettings.ContractResolver =new IgnoreZeroContractResolver();
});
// ...
}
Test Case :
var x = new {
FirstValue =0.2000,
SecondValue= 30.80,
ThirdValue= 0.0,
FourthValue= 30.80,
FifthValue= 0.0, // double 0
SixValue= 0 // int 0
};
return new JsonResult(x);
and the response will be :
{"FirstValue":0.2,"SecondValue":30.8,"FourthValue":30.8}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381118%2fexclude-zero-values-when-streaming-to-json-with-jsonresult-in-mvc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
That's super easy. Just specify a value for DefaultValueHandling with the value Ignore.
As the description in that link says:
Ignore members where the member value is the same as the member's default value when serializing objects so that it is not written to JSON. This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, decimals and floating point numbers; and false for booleans). The default value ignored can be changed by placing the DefaultValueAttribute on the property.
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
add a comment |
That's super easy. Just specify a value for DefaultValueHandling with the value Ignore.
As the description in that link says:
Ignore members where the member value is the same as the member's default value when serializing objects so that it is not written to JSON. This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, decimals and floating point numbers; and false for booleans). The default value ignored can be changed by placing the DefaultValueAttribute on the property.
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
add a comment |
That's super easy. Just specify a value for DefaultValueHandling with the value Ignore.
As the description in that link says:
Ignore members where the member value is the same as the member's default value when serializing objects so that it is not written to JSON. This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, decimals and floating point numbers; and false for booleans). The default value ignored can be changed by placing the DefaultValueAttribute on the property.
That's super easy. Just specify a value for DefaultValueHandling with the value Ignore.
As the description in that link says:
Ignore members where the member value is the same as the member's default value when serializing objects so that it is not written to JSON. This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, decimals and floating point numbers; and false for booleans). The default value ignored can be changed by placing the DefaultValueAttribute on the property.
answered Nov 19 '18 at 20:53
KitKit
8,92323268
8,92323268
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
add a comment |
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
Please see the startup code now added to my question, how do I integrate it in there? There is no register method
– Paul
Nov 20 '18 at 0:15
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
I managed to get somewhere to run this code, I know it is being hit because I also set the JSON to be pretty printed. I have put DefaultValue(0) above my properties and they are still getting output?
– Paul
Nov 20 '18 at 1:17
add a comment |
As Kit suggested, you could use the DefaultValueHandling
behavior.
Besides, you can always custom your own ContractResolver
to solve such questions. Here's a version of using custom ContractResolver
to ignore default value:
public class IgnoreZeroContractResolver : DefaultContractResolver
{
public IgnoreZeroContractResolver( ){ }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
var shouldSerialize = true; // indicate should we serialize this property
var type = instance.GetType();
var pi = type.GetProperty(property.PropertyName);
var pv = pi.GetValue(instance);
var pvType = pv.GetType();
// if current value equals the default values , ignore this property
if (pv.GetType().IsValueType){
var defaultValue = Activator.CreateInstance(pvType);
if (pv.Equals(defaultValue)) { shouldSerialize = false; }
}
return shouldSerialize;
};
return property;
}
}
And now you can set your resover as the ContractResolver
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(o =>{
o.SerializerSettings.ContractResolver =new IgnoreZeroContractResolver();
});
// ...
}
Test Case :
var x = new {
FirstValue =0.2000,
SecondValue= 30.80,
ThirdValue= 0.0,
FourthValue= 30.80,
FifthValue= 0.0, // double 0
SixValue= 0 // int 0
};
return new JsonResult(x);
and the response will be :
{"FirstValue":0.2,"SecondValue":30.8,"FourthValue":30.8}
add a comment |
As Kit suggested, you could use the DefaultValueHandling
behavior.
Besides, you can always custom your own ContractResolver
to solve such questions. Here's a version of using custom ContractResolver
to ignore default value:
public class IgnoreZeroContractResolver : DefaultContractResolver
{
public IgnoreZeroContractResolver( ){ }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
var shouldSerialize = true; // indicate should we serialize this property
var type = instance.GetType();
var pi = type.GetProperty(property.PropertyName);
var pv = pi.GetValue(instance);
var pvType = pv.GetType();
// if current value equals the default values , ignore this property
if (pv.GetType().IsValueType){
var defaultValue = Activator.CreateInstance(pvType);
if (pv.Equals(defaultValue)) { shouldSerialize = false; }
}
return shouldSerialize;
};
return property;
}
}
And now you can set your resover as the ContractResolver
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(o =>{
o.SerializerSettings.ContractResolver =new IgnoreZeroContractResolver();
});
// ...
}
Test Case :
var x = new {
FirstValue =0.2000,
SecondValue= 30.80,
ThirdValue= 0.0,
FourthValue= 30.80,
FifthValue= 0.0, // double 0
SixValue= 0 // int 0
};
return new JsonResult(x);
and the response will be :
{"FirstValue":0.2,"SecondValue":30.8,"FourthValue":30.8}
add a comment |
As Kit suggested, you could use the DefaultValueHandling
behavior.
Besides, you can always custom your own ContractResolver
to solve such questions. Here's a version of using custom ContractResolver
to ignore default value:
public class IgnoreZeroContractResolver : DefaultContractResolver
{
public IgnoreZeroContractResolver( ){ }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
var shouldSerialize = true; // indicate should we serialize this property
var type = instance.GetType();
var pi = type.GetProperty(property.PropertyName);
var pv = pi.GetValue(instance);
var pvType = pv.GetType();
// if current value equals the default values , ignore this property
if (pv.GetType().IsValueType){
var defaultValue = Activator.CreateInstance(pvType);
if (pv.Equals(defaultValue)) { shouldSerialize = false; }
}
return shouldSerialize;
};
return property;
}
}
And now you can set your resover as the ContractResolver
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(o =>{
o.SerializerSettings.ContractResolver =new IgnoreZeroContractResolver();
});
// ...
}
Test Case :
var x = new {
FirstValue =0.2000,
SecondValue= 30.80,
ThirdValue= 0.0,
FourthValue= 30.80,
FifthValue= 0.0, // double 0
SixValue= 0 // int 0
};
return new JsonResult(x);
and the response will be :
{"FirstValue":0.2,"SecondValue":30.8,"FourthValue":30.8}
As Kit suggested, you could use the DefaultValueHandling
behavior.
Besides, you can always custom your own ContractResolver
to solve such questions. Here's a version of using custom ContractResolver
to ignore default value:
public class IgnoreZeroContractResolver : DefaultContractResolver
{
public IgnoreZeroContractResolver( ){ }
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance => {
var shouldSerialize = true; // indicate should we serialize this property
var type = instance.GetType();
var pi = type.GetProperty(property.PropertyName);
var pv = pi.GetValue(instance);
var pvType = pv.GetType();
// if current value equals the default values , ignore this property
if (pv.GetType().IsValueType){
var defaultValue = Activator.CreateInstance(pvType);
if (pv.Equals(defaultValue)) { shouldSerialize = false; }
}
return shouldSerialize;
};
return property;
}
}
And now you can set your resover as the ContractResolver
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddJsonOptions(o =>{
o.SerializerSettings.ContractResolver =new IgnoreZeroContractResolver();
});
// ...
}
Test Case :
var x = new {
FirstValue =0.2000,
SecondValue= 30.80,
ThirdValue= 0.0,
FourthValue= 30.80,
FifthValue= 0.0, // double 0
SixValue= 0 // int 0
};
return new JsonResult(x);
and the response will be :
{"FirstValue":0.2,"SecondValue":30.8,"FourthValue":30.8}
answered Nov 20 '18 at 10:35
itminusitminus
3,7061421
3,7061421
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381118%2fexclude-zero-values-when-streaming-to-json-with-jsonresult-in-mvc%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Seems like you should be able to do this when querying the data out before returning it with a
.Where(x => x.Value != 0)
– GregH
Nov 19 '18 at 19:12
I dont want to do it that way because this is an object with loads of properties and that would be a huge where clause!
– Paul
Nov 19 '18 at 19:18
I see. In that case you may find newtonsoft's conditional serialization interesting: newtonsoft.com/json/help/html/ConditionalProperties.htm although I believe you'll still have to define which properties you want to conditionally exclude one way or the other. I'll be interested to see if someone has a more graceful way of achieving this. Hope this helps
– GregH
Nov 19 '18 at 19:23
1
Which version of asp.net-mvc are you using? For JSON serialization, earlier versions use
JavaScriptSerializer
as noted here but ASP.Net Core uses Json.NET as noted here. The answer will differ depending on the serializer.– dbc
Nov 19 '18 at 19:40
Im using ASPNet core - I am running this from inside a service fabric host which is running a Web API - I have the package Microsoft.AspNetCore.Mvc in the service
– Paul
Nov 19 '18 at 20:17