.net - JSON序列化时如何本地化?

标签 .net json serialization localization json.net

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

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

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

顺便说一句,我真的希望避免在 JavaScript 端进行本地化。我绝对希望 .NET 能够处理跨文化格式化和本地化,我认为不应该有像我在这个序列化器中发现的异常(exception)情况,我的猜测是应该有一个正确的方法来做到这一点。

提前致谢。

最佳答案

用于序列化十进制值的 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"]

关于.net - JSON序列化时如何本地化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4721143/

相关文章:

javascript - 如何序列化一个javascript对象

c++ - 编译期间 boost xml 序列化失败

c# - 没有 IDynamicMetaObject 的 C# 中的动态?

php - Android 到 php 发送 UTF8 编码文本,不适用于西里尔文或阿拉伯文字符

c# - 如何将构建属性传递给 dotnet?

sql-server - SQL Server 2016 JSON_VALUE 语法

JavaScript 循环无法正确计算/显示结果

XmlElement 的 C# 数组正在添加另一层嵌套

c# - 如何使用 MSBuild 将链接文件添加到 csproj 文件。 (3.5 框架)

c# - 发布错误 : Could not load file or assembly 'Microsoft.Web.XmlTransform' , Version=1.4.0.0, Culture=neutral 等或其依赖项之一