using Newtonsoft.Json.Serialization;
using System.Globalization;
public class MyJsonConverter : JsonConverter
public override bool CanConvert(Type objectType) => objectType == typeof(double) || objectType == typeof(double?);
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
if (value is double input && double.IsFinite(input))
writer.WriteRawValue(input.ToString("G3", NumberFormatInfo.InvariantInfo));
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) => throw new NotImplementedException();
public class SkipNullPropertyContractResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(System.Reflection.MemberInfo member, MemberSerialization memberSerialization)
var property = base.CreateProperty(member, memberSerialization);
property.ShouldSerialize = instance =>
var value = property.ValueProvider.GetValue(instance);
using (var writer = new System.IO.StringWriter())
var jsonWriter = new JsonTextWriter(writer);
var serializer = new JsonSerializer();
serializer.Converters.Add(new MyJsonConverter());
serializer.Serialize(jsonWriter, value);
var serializedValue = writer.ToString();
return serializedValue != "null";
static void Main(string[] args)
da: new[] { 1.23456789 },
nda: new double?[] { 1.23456789, null, double.NaN });
var settings = new JsonSerializerSettings
NullValueHandling = NullValueHandling.Ignore,
Converters = { new MyJsonConverter() },
ContractResolver = new SkipNullPropertyContractResolver()
var json = JsonConvert.SerializeObject(test, settings);