如何在JSON序列化时进行本地化?

时间:2011-01-18 06:32:26

标签: .net json serialization localization json.net

我一直在努力工作几个小时但没有取得好成绩。我正在尝试使用.NET JSON Serializers将JSON从UI来回转换为对象。

问题出现在小数位上,因为我的文化标准有“,”作为小数分隔符而不是“。”。我尝试过实现自定义转换器(请参阅this问题)但效果不佳。

我还检查了NewtonSoft JSON.net而没有更好的结果。到目前为止,似乎与价值类型的匹配是文化不变的。我想覆盖这种行为,该怎么做?

顺便说一下,我真的希望避免在javascript端进行本地化。我绝对希望.NET能够处理跨文化格式化和本地化,我不认为应该有这样的序列化器之类的异常,我的猜测是应该有一个正确的方法来实现这一点。

提前致谢。

2 个答案:

答案 0 :(得分:16)

用于序列化十进制值的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 :(得分:1)

您是否在当前主题的 CurrentCulture CurrentUICulture 属性中设置了正确的 CultureInfo