I'm using the Newtonsoft JSON serializer and it works for most objects.
Unfortunately I get a JsonSerializationException
when I try to serialize a large object, one of whose members throws a NullReferenceException
.
Is there anyway to ignore the offending member and serialize the rest of the object?
I'm thinking perhaps in the JsonSerializerSettings
?
Here's a simplified version of what I want to do:
private class TestExceptionThrowingClass { public string Name { get { return "The Name"; } } public string Address { get { throw new NullReferenceException(); } } public int Age { get { return 30; } } } [Test] public void CanSerializeAClassWithAnExceptionThrowingMember() { // Arrange var toSerialize = new TestExceptionThrowingClass(); // Act var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); serializerSettings.MaxDepth = 5; serializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; serializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore; serializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; serializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Reuse; serializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore; var result = Newtonsoft.Json.JsonConvert.SerializeObject(toSerialize); // Assert Assert.That(result, Is.EqualTo(@"{""Name"":""The Name"",""Age"":30}")); }
And here's the stack trace:
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonConvert.SerializeObject(Object value, Type type, Formatting formatting, JsonSerializerSettings settings) at Newtonsoft.Json.JsonConvert.SerializeObject(Object value) at AspectsProject.Aspects.CachingPolicy.CachingPolicyCacheKeyCreatorTests.CanSerializeAClassWithAnExceptionThrowingMember() in D:\Dev\test.cs:line 169 --NullReferenceException at AspectsProject.Aspects.CachingPolicy.CachingPolicyCacheKeyCreatorTests.TestExceptionThrowingClass.get_Address() in D:\Dev\test.cs:line 149 at GetAddress(Object ) at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)
I'm happy to use a different JSON serializer if someone knows one that will do this.
A simpler way to ignore errors:
JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Error = (serializer,err) => { err.ErrorContext.Handled = true; }
or
settings.Error = (serializer,err) => err.ErrorContext.Handled = true;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With