【问题标题】:How to localize when JSON-serializing?JSON序列化时如何本地化?
【发布时间】:2011-06-10 21:43:57
【问题描述】:

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

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

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

顺便说一句,我真的希望避免在 javascript 方面进行本地化。我绝对希望 .NET 来处理跨文化格式和本地化,我不认为应该有像我在这个序列化程序中发现的例外,我的猜测是应该有一个适当的方法来做到这一点。

提前致谢。

【问题讨论】:

    标签: .net json serialization localization json.net


    【解决方案1】:

    您是否在当前线程的 CurrentCultureCurrentUICulture 属性上设置了正确的 CultureInfo

    【讨论】:

    【解决方案2】:

    序列化十进制值的 JSON 标准不提供本地化格式。 (请参阅 JSON.org。)这就是为什么值总是使用 Invariant 文化进行格式化的原因。

    如果您需要本地化值,那么您需要为您选择的序列化程序创建一个自定义转换器,它将小数输出为预先格式化的字符串。在 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"]
    

    【讨论】:

    • 非常感谢您花时间回答。这个问题有点老了,但我仍然很感激学习如何在未来解决这些问题。再次感谢!
    • 很高兴为您提供帮助。新年快乐!
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多