如何在没有明确列出每列的情况下格式化LINQ中的日期?

时间:2013-06-11 20:35:03

标签: c# json linq

我收到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.....});

2 个答案:

答案 0 :(得分:1)

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

[ScriptIgnore]属性放在DateTime属性上,并实现将日期值作为字符串获取的代理属性。 [ScriptIgnore]将跳过JavaScriptSerializer的属性,并将发出代理属性。例如:

[ScriptIgnore]
public DateTime DateValue { get; set; }

public string DateValueJS
{
    get { return DateValue.ToString("g"); }
}

方法2:将CustomConverters与JavaScriptSerializer一起使用

使用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"}}

方法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的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的值。