1

我在 JSON 字符串中遇到了 Date 错误:/Date(1370963229000)/ is not a valid value for DateTime.,我可以通过ToString("g")在日期上执行 a 来解决这个问题,但我不想在我的 select 语句中显式地放置每一列。

目前,我正在做:

var people = _context.People.ToList();

我不想做var people = _context.People.Select({x=>x.Id.....});

4

2 回答 2

1

方法一:使用“代理”属性

[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语句中使用此方法将对象值转换为DictionaryJavaScriptSerializer用于发出 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]}]

于 2013-06-11T21:37:16.490 回答
0

我从未使用过JavaScriptSerializer,但如果您对数据的反序列化方式有任何影响,我建议将此数据字段反序列化为字符串,然后在Person类上有一个属性,该属性将返回转换为DateTime.

于 2013-06-11T21:08:35.583 回答