2014-11-21 120 views
3

我需要創建一個遺留系統的自定義JSON.NET轉換器,標誌空十進制值與...定製JsonConverter可以decimal.MinValue轉換爲空字符串和背部

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

回答

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 
} 

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

+0

沒問題;樂意效勞。 – 2014-11-21 18:54:23

+0

非常感謝代碼@BrianRogers – IgorShch 2016-01-21 11:41:05