自定义JsonConverter,可以将decimal.MinValue转换为空字符串并返回

我需要为旧系统创建一个自定义JSON.NET转换器,用于标记空小数值…

var nulldec = decimal.MinValue; 

(这是在引入可空类型之前创建的,并且改变它的工作方式将是大量的工作。)

当这些min值被序列化为JSON时,它们需要被序列化为空字符串。 当它们被反序列化时,如果值为空字符串,则需要转换为decimal.MinValue

这是我到目前为止(是的,不多)。 我认为这是一个简单的转换,但我没有看到任何文章指出我如何为我的情况工作,也没有任何关于如何创建自定义转换器的文档。 有人可以帮忙吗?

 public class DecimalJsonConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { } public override bool CanConvert(Type objectType) { return typeof(System.Decimal).IsAssignableFrom(objectType); } } 

以下转换器实现应该为您提供您想要的:

 public class DecimalJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(decimal)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { if ((string)reader.Value == string.Empty) { return decimal.MinValue; } } else if (reader.TokenType == JsonToken.Float || reader.TokenType == JsonToken.Integer) { return Convert.ToDecimal(reader.Value); } throw new JsonSerializationException("Unexpected token type: " + reader.TokenType.ToString()); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { decimal dec = (decimal)value; if (dec == decimal.MinValue) { writer.WriteValue(string.Empty); } else { writer.WriteValue(dec); } } } 

这是一个往返演示:

 class Program { static void Main(string[] args) { string json = @" { ""MinValueAsString"" : """", ""ARealDecimal"" : 3.14159, ""AnInteger"" : 42 }"; JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new DecimalJsonConverter()); settings.Formatting = Formatting.Indented; Foo foo = JsonConvert.DeserializeObject(json, settings); Console.WriteLine("MinValueAsString: " + foo.MinValueAsString); Console.WriteLine("ARealDecimal: " + foo.ARealDecimal); Console.WriteLine("AnInteger: " + foo.AnInteger); Console.WriteLine(); json = JsonConvert.SerializeObject(foo, settings); Console.WriteLine(json); } class Foo { public decimal MinValueAsString { get; set; } public decimal ARealDecimal { get; set; } public decimal AnInteger { get; set; } } } 

输出:

 MinValueAsString: -79228162514264337593543950335 ARealDecimal: 3.14159 AnInteger: 42 { "MinValueAsString": "", "ARealDecimal": 3.14159, "AnInteger": 42.0 } 

小提琴: https : //dotnetfiddle.net/dip85r