我收到JSON字符串中的日期错误:/Date(1370963229000)/ is not a valid value for DateTime.
,我可以通过在日期执行ToString("g")
来解决此问题,但我不想明确地放置我的select语句中的每一列。
目前,我正在做:
var people = _context.People.ToList();
我不想做var people = _context.People.Select({x=>x.Id.....});
答案 0 :(得分:1)
将[ScriptIgnore]
属性放在DateTime
属性上,并实现将日期值作为字符串获取的代理属性。 [ScriptIgnore]
将跳过JavaScriptSerializer
的属性,并将发出代理属性。例如:
[ScriptIgnore]
public DateTime DateValue { get; set; }
public string DateValueJS
{
get { return DateValue.ToString("g"); }
}
使用JavaScriptSerializer
中内置的CustomConverters支持来注册您自己的类,以处理特定类型的序列化。例如:
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"}}
在序列化值时,您可以使用反射将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的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]}]
将发出{{1}}
答案 1 :(得分:0)
我从未使用JavaScriptSerializer
,但如果您对数据的反序列化有任何影响,我建议将此数据字段反序列化为字符串,然后在Person
类上有一个属性这将返回转换为DateTime
的值。