方法一:使用“代理”属性
将[ScriptIgnore]
属性放在您的DateTime
属性上并实现以字符串形式获取日期值的代理属性。带有的属性[ScriptIgnore]
将被跳过JavaScriptSerializer
并发出代理属性。例如:
[ScriptIgnore]
public DateTime DateValue { get; set; }
public string DateValueJS
{
get { return DateValue.ToString("g"); }
}
方法 2:将 CustomConverters 与 JavaScriptSerializer 一起使用
使用内置的 CustomConverters 支持JavaScriptSerializer
来注册您自己的类以处理特定类型的序列化。例如:
public class DateJsonConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new Type[] { typeof(DateTime) }; }
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
return new Dictionary<string, object>()
{
{ "Value", ((DateTime)obj).ToString("g") }
};
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotSupportedException();
}
}
你像这样使用这个自定义转换器:
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new DateJsonConverter() });
日期值将由此类序列化为:{"Dt":{"Value":"6/11/2013 5:36 PM"}}
方法3:使用Reflection透明格式化DateTime
当值被序列化时,您可以使用反射将值透明地转换DateTime
为值。string
例如:
private static object FormatDateTime(object x)
{
if (x == null || x is IEnumerable)
return x;
var t = x.GetType();
if (t == typeof(DateTime))
return ((DateTime)x).ToString("g");
if (t.IsPrimitive)
return x;
var result = new Dictionary<string, object>();
foreach (var prop in t.GetProperties())
{
// Skip properties with ScriptIgnoreAttribute
if (prop.GetCustomAttributes(typeof(ScriptIgnoreAttribute), true).Any())
continue;
result[prop.Name] = FormatDateTime(prop.GetValue(x, null));
}
return result;
}
可以在您的Select
语句中使用此方法将对象值转换为Dictionary
可JavaScriptSerializer
用于发出 JSON 的 a。例如:
var value = new[] { new { Dt = DateTime.Now, Childs = new[] { 1, 2, 3 } } };
serializer.Serialize(value.Select(x => FormatDateTime(x)))
会发出[{"Dt":"6/12/2013 3:27 PM","Childs":[1,2,3]}]