using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class IgnoreNullValuesWhenDeserializingRootConverter : JsonConverter
bool Disabled { get { return disabled; } set { disabled = value; } }
public override bool CanWrite => false;
public override bool CanRead => !Disabled;
public override bool CanConvert(Type objectType) => !Disabled;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
using (new PushValue<bool>(true, () => Disabled, val => Disabled = val))
using (new PushValue<NullValueHandling>(NullValueHandling.Ignore, () => serializer.NullValueHandling, val => serializer.NullValueHandling = val))
return serializer.Deserialize(reader, objectType);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
public struct PushValue<T> : IDisposable
public PushValue(T value, Func<T> getValue, Action<T> setValue)
if (getValue == null || setValue == null)
throw new ArgumentNullException();
this.setValue = setValue;
this.oldValue = getValue();
#region IDisposable Members
public void Dispose() => setValue?.Invoke(oldValue);
int? nullableIntValue = 101;
string stringValue = "i was not nulled out";
public string StringValue
Console.WriteLine("Setter for {0} called", nameof(StringValue));
public int? NullableIntValue
Console.WriteLine("Setter for {0} called", nameof(NullableIntValue));
nullableIntValue = value;
public string ShouldBeNull { get; set; }
public static void Test()
var json = @"{""StringValue"":null, ""NullableIntValue"" : null}";
SerializerSettings = new JsonSerializerSettings(),
options.SerializerSettings.Converters.Add(new IgnoreNullValuesWhenDeserializingRootConverter());
options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
var model = JsonConvert.DeserializeObject<Model>(json, options.SerializerSettings);
var json2 = JsonConvert.SerializeObject(model, options.SerializerSettings);
Console.WriteLine("Input JSON: {0}", json);
Console.WriteLine("Re-serialized {0}: {1}", model, json2);
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("{0} version: {1}", typeof(JsonSerializer).Namespace, typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");