JavaScriptSerializer не использует CultureInfo.CurrentCulture - PullRequest
0 голосов
/ 24 октября 2011

Как получить JavaScriptSerializer от System.Web.Extensions для использования CultureInfo.CurrentCulture?

Я получаю исключения, десериализирующие дату / время в формате ДД / ММ / ГГГГ, поскольку в настоящее время они ожидают их в формате США, что неправильно для нашего приложения.

1 Ответ

1 голос
/ 24 октября 2011

Согласно примечаниям MDSN на JavaScriptSerializer:

Объект Date, представленный в формате JSON как "/ Date (количество тиков) /". Число тиков - это положительное или отрицательное длинное значение, которое указывает количество тиков (миллисекунд), прошедшее с полуночи 1 января 1970 года по Гринвичу.

Максимальное поддерживаемое значение даты - MaxValue (31.12.9999 11:59:59 PM), а минимальное поддерживаемое значение даты - MinValue (1/1/0001 12:00:00 AM).

Вам необходимо зарегистрировать JavaScriptConverter для DateTime, который обрабатывает ваш тип:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...