如何控制用于字典条目的转换器?

时间:2014-05-26 12:15:59

标签: c# serialization json.net

我已成功在我的类中应用JsonConverter属性来管理过去用于对象属性的转换器。现在,我有一个包含多个DateTime条目的字典,需要以不同的格式进行转换。例如,看看下面的字典:

var header = new Dictionary<string, object>
{
     {"Id", reader.GetInt32(0)},
     ...
     {"CreatedAt", reader.GetDateTime(4)},
     ...
     {"StartDate", reader.GetDateTime(7)},
     ...
};

在序列化此词典时,我希望CreatedAt采用不同的格式,StartDate采用不同的格式。 CreatedAt应具有完整的ISO格式,例如2014-05-26T09:13:34.56StartDate应该只有日期,例如2014-05-26

告诉Json.NET如何格式化字典条目的首选方法是什么?

1 个答案:

答案 0 :(得分:1)

这是一种可以做到的方法:

  1. 创建自己的DateOnly类,该类包含DateTime结构。
  2. 通过扩展Newtonsoft.Json.JsonConverter抽象类来实现您自己的类型转换器。

    public class DateOnly { public DateTime Date { get; set; } }

  3. Conveter class

        public class DateOnlyConverter : JsonConverter
       {
          public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        { 
            if (value is DateOnly)
            {
                writer.WriteValue(((DateOnly) value).Date.ToString("yyyy-MM-dd")); 
            }
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            string value = reader.ReadAsString();
    
            try
            {
                return DateTime.ParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture); 
            }
            catch (FormatException)
            {
                return null; 
            }
        }
    
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof (DateOnly); 
        }
    }
    

    添加仅限日期的类而不是DateTime struct

    var header = new Dictionary<string, object>
    {
     {"Id", reader.GetInt32(0)},
     ...
     {"CreatedAt", reader.GetDateTime(4)},
     ...
     {"StartDate", new DateOnly { Date =  reader.GetDateTime(7)}},
     ...
     };
    

    最后

    string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter(), new DateOnlyConverter ());