StackOverflow Q27063475

CSharp · Console

/Program.cs

using System;
using Newtonsoft.Json;
					
public class Program
{
	public static void Main()
	{
		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; }
}

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)
		{
			string value = (string)reader.Value;
			if (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);
		}
	}
}
;