自定义JsonConverter可以将decimal.MinValue转换为空字符串并返回 [英] Custom JsonConverter that can convert decimal.MinValue to empty string and back

查看:157
本文介绍了自定义JsonConverter可以将decimal.MinValue转换为空字符串并返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要为旧系统创建一个自定义JSON.NET转换器,该转换器使用...标记空的十进制值.

I need to create a custom JSON.NET converter for a legacy system that flags null decimal values with...

var nulldec = decimal.MinValue;

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

(This was created before nullable types were introduced, and to change how this works will be a ton of work.)

当这些最小值被序列化为JSON时,它们需要被序列化为一个空字符串.反序列化时,如果值为空字符串,则需要将其转换为decimal.MinValue.

When these min-values are serialized to JSON they need to be serialized as an empty string. When they are deserialized, if the value is empty string, it needs to convert to decimal.MinValue.

这是我到目前为止所拥有的(是,不是很多).我认为这是一个简单的转换,但是我看不到任何文章指出如何针对我的情况进行此操作,也看不到任何有关如何创建自定义转换器的文档.有人可以帮忙吗?

Here is what I have so far (yes, not much). I think this is a simple conversion, but I am not seeing any articles that point me to how to work this for my situation nor any documentation on how to create custom converters. Can someone help please?

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); 
    }
}

推荐答案

以下转换器实现应为您提供所需的东西:

The following converter implementation should give you what you want:

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
}

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

这篇关于自定义JsonConverter可以将decimal.MinValue转换为空字符串并返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆