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

C# 自定义JsonConverter,可将decimal.MinValue转换为空字符串并返回,c#,asp.net-mvc-4,json.net,C#,Asp.net Mvc 4,Json.net,我需要为遗留系统创建一个自定义JSON.NET转换器,该系统使用 var nulldec = decimal.MinValue; (这是在引入可空类型之前创建的,要更改其工作方式将需要大量工作。) 将这些最小值序列化为JSON时,需要将其序列化为空字符串。反序列化时,如果值为空字符串,则需要将其转换为decimal.MinValue 这是我到目前为止的资料(是的,不多)。我认为这是一个简单的转换,但我没有看到任何文章指出如何在我的情况下工作,也没有任何关于如何创建自定义转换器的文档。有人能帮忙

我需要为遗留系统创建一个自定义JSON.NET转换器,该系统使用

var nulldec = decimal.MinValue;
(这是在引入可空类型之前创建的,要更改其工作方式将需要大量工作。)

将这些最小值序列化为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<Foo>(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
}