Как сериализовать объект в json на основе клиентской культуры с помощью newtonsoft? - PullRequest
0 голосов
/ 26 сентября 2019

Я использую Newtonsoft.Json.JsonConverter и .NET Framework 4.7.2.

У меня есть контроллер, который возвращает объект со свойством типа LocalizedString, который представляет собой простой объект с 2 свойствами:английское и французское представление строки.

Контроллер устанавливает текущую нить в текущий поток следующим образом:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(this.Name);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(this.Name);

Культура исходит из файлов cookie запроса и при запросе в контроллереПОЛУЧИТЕ метод, это работает.

LocalizedString имеет метод ToString, который выглядит следующим образом:

public string ToString(string language)
{
   return language.Equals(Language.English.CultureName, StringComparison.OrdinalIgnoreCase) ? this.English : this.French;
}

Теперь у меня есть JsonConverter для управления сериализацией объектов LocalizedString, который выглядит следующим образом:

public class LocalizedStringJsonConverter : JsonConverter
{
    #region Methods

    /// <summary>
    /// Writes the JSON representation of the object.
    /// </summary>
    /// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param><param name="value">The value.</param><param name="serializer">The calling serializer.</param>
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((LocalizedString)value).ToString(Thread.CurrentThread.CurrentCulture.Name));
    }

    /// <summary>
    /// Reads the JSON representation of the object.
    /// </summary>
    /// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param><param name="objectType">Type of the object.</param><param name="existingValue">The existing value of object being read.</param><param name="serializer">The calling serializer.</param>
    /// <returns>
    /// The object value.
    /// </returns>
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    /// <summary>
    /// Determines whether this instance can convert the specified object type.
    /// </summary>
    /// <param name="objectType">Type of the object.</param>
    /// <returns>
    /// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
    /// </returns>
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(LocalizedString);
    }

    #endregion
}

Когда я запрашиваю культуру в JsonConverter следующим образом: Thread.CurrentThread.CurrentCulture.Name

Значение всегда является культурой сервера (которая является французской, когда я отлаживаю на моем ПК).

Я пытаюсь понять, что я делаю неправильно ... Я знаю множество других способов сделать то, что я хочу сделать, например, я мог бы позволить клиенту управлять культурой с помощью javascript или мой контроллер мог бы на самом деле вернутьстрока предварительно локализована, но это означало бы, что мне нужно было бы провести рефакторинг всего веб-приложения ... которого я пытаюсь избежать.

Спасибо за ваше время

ОБНОВЛЕНИЕ

Я попытался добавить свой собственный фильтр, чтобы убедиться, что культура все еще установлена ​​после того, как мой контроллер возвращается, но JsonConverter выполняется после метода OnActionExecutedу фильтра и культура все равно не так.Я не знаю, что называет JsonConverter, но, вероятно, именно там должна быть установлена ​​культура ...

1 Ответ

0 голосов
/ 26 сентября 2019

Согласно Как определяется культура потока ваш код должен работать, если вы правильно установите культуру.

Что такое Console.WriteLine("CurrentCulture is now {0}.", CultureInfo.CurrentCulture.Name); непосредственно перед тем, как вы вернетесь из контроллера (так, как раз передсериализатор называется)?

Кроме того, Microsoft doco заявляет:

. В .NET Framework 4.5.2 и более ранних версиях Свойство CurrentCulture доступно только для чтения;то есть вы можете получить значение свойства, но не можете его установить.Чтобы изменить текущую культуру, вы присваиваете объект CultureInfo, представляющий новую культуру, свойству Thread.CurrentThread.CurrentCulture.Начиная с .NET Framework 4.6, свойство CurrentCulture доступно для чтения и записи;Вы можете установить и получить значение свойства.Если для свойства установить значение CultureInfo , представляющее новую культуру, значение свойства Thread.CurrentThread.CurrentCulture также изменится.

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