我需要为遗留系统创建一个自定义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);
}
}
答案 0 :(得分:5)
以下转换器实现应该为您提供所需的内容:
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
}