Как локализовать при JSON-сериализации? - PullRequest
15 голосов
/ 18 января 2011

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

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

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

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

Заранее спасибо.

Ответы [ 2 ]

16 голосов
/ 26 декабря 2013

Стандарт 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"]
1 голос
/ 18 января 2011

Правильно ли настроены CultureInfo в свойствах CurrentCulture и CurrentUICulture вашего текущего потока?

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