如何從System.Web.Extensions獲取JavaScriptSerializer以使用CultureInfo.CurrentCulture?JavaScriptSerializer不使用CultureInfo.CurrentCulture
我收到了反序列化DD/MM/YYYY DateTimes的異常,因爲它目前預計它們採用美國格式,這對我們的應用程序不正確。
如何從System.Web.Extensions獲取JavaScriptSerializer以使用CultureInfo.CurrentCulture?JavaScriptSerializer不使用CultureInfo.CurrentCulture
我收到了反序列化DD/MM/YYYY DateTimes的異常,因爲它目前預計它們採用美國格式,這對我們的應用程序不正確。
每MDSN備註JavaScriptSerializer:
日期目的,JSON表示爲 「/日期(蜱數)/」。蜱數是正值或負值,表示自1970年1月1日午夜以來經過的蜱數(毫秒)。
支持的最大日期值是MaxValue(12/31/9999 11:59:59 PM),支持的最小日期值是MinValue(1/1/0001 12:00:00 AM)。
你需要爲DateTime
來處理你的類型註冊一個JavaScriptConverter
:
public class DateTimeConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary == null)
throw new ArgumentNullException("dictionary");
if (type == typeof(DateTime))
{
DateTime time;
time = DateTime.Parse(dictionary["Time"].ToString(), /** put your culture info here **/);
return time;
}
return null;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
DateTime? time = obj as DateTime?;
if (time == null)
{
Dictionary<string, object> result = new Dictionary<string, object>();
result["Time"] = time.Value;
return result;
}
return new Dictionary<string, object>();
}
public override IEnumerable<Type> SupportedTypes
{
get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(DateTime) })); }
}
}
記住
熊,你需要考慮你的JSON實際上有對象屬性名稱的條款(你可能使用的不是「Time」的名字)。
註冊它在你的JavaScriptSerializer:
serializer.RegisterConverters(new List<JavaScriptConverter>() { new DateTimeConverter() });
最後,請注意,有更多可以做,而這僅僅是建立在一個例子。顯式地,它正在搜索名稱爲「Time」的字典項目,並且不處理分析失敗。對於使用DateTime的字段,您可能不只有一個名稱。
感謝您的回答! 2個問題:是否有可能將序列化結果仍然表示爲原始類型?即沒有它包裹在另一個對象瓦特/時間屬性?另外,您是否知道轉換器處理SupportedTypes屬性的所有派生類型的方法?我問,因爲我也想用這個特性以某種方式序列化一個特定的接口。 –
我不確定你的第一個問題的答案。對於任何需要專門處理的類型,您都需要爲其創建一個轉換器,並按照上面的方法註冊它。 – doctorless