Подтвердить что ты не робот

Как локализовать, когда JSON-сериализация?

Я боролся в течение нескольких часов без хорошего результата. Я пытаюсь использовать .NET JSON Serializers для преобразования JSON обратно и обратно из пользовательского интерфейса в объекты.

Проблема возникает с десятичными знаками, потому что стандарт для моей культуры имеет "," как десятичный разделитель вместо ".". Я пробовал реализовать пользовательский конвертер (см. этот вопрос) без хороших результатов.

Я также проверил NewtonSoft JSON.net без лучших результатов. До сих пор кажется, что сопоставление с типами значений осуществляется с учетом культуры. Я хочу переопределить это поведение, как это сделать?

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

Спасибо заранее.

4b9b3361

Ответ 1

Стандарт JSON для сериализации десятичных значений не предусматривает локализованного форматирования. (См. JSON.org.) Поэтому значения всегда отформатированы с помощью инвариантной культуры.

Если вам нужны локализованные значения, вам нужно создать собственный конвертер для вашего сериализатора выбора, который вместо этого выводит десятичные числа в виде предварительно отформатированных строк. В Json.Net это можно сделать легко, как показано ниже:

class Program
{
    static void Main(string[] args)
    {
        List<decimal> values = new List<decimal> { 1.1M, 3.14M, -0.9M, 1000.42M };

        var converter = new FormattedDecimalConverter(CultureInfo.GetCultureInfo("fr-FR"));
        string json = JsonConvert.SerializeObject(values, converter);

        Console.WriteLine(json);
    }
}

class FormattedDecimalConverter : JsonConverter
{
    private CultureInfo culture;

    public FormattedDecimalConverter(CultureInfo culture)
    {
        this.culture = culture;
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(decimal) ||
                objectType == typeof(double) ||
                objectType == typeof(float));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(Convert.ToString(value, culture));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Вывод:

["1,1","3,14","-0,9","1000,42"]

Ответ 2

Вы устанавливаете CultureInfo в свой текущий поток CurrentCulture и CurrentUICulture.