一尘不染

JSON序列化时如何本地化?

json

我已经奋斗了几个小时,没有取得好结果。我正在尝试使用.NET JSON序列化程序将JSON从UI来回转换为对象。

小数引起了问题,因为我的文化的标准使用“,”作为小数分隔符而不是“。”。我尝试实现自定义转换器,但效果不佳。

我还检查了NewtonSoft JSON.net,但没有得到更好的结果。到目前为止,似乎与值类型的匹配是文化不变的。我要覆盖此行为,该怎么办?

顺便说一句,我真的很想避免在javascript方面进行本地化。我绝对希望.NET负责跨文化的格式设置和本地化,我不认为应该有像使用此序列化程序那样的例外,我想应该有一种适当的方法来做到这一点。

提前致谢。


阅读 259

收藏
2020-07-27

共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"]
2020-07-27