Dot-Net

JSON序列化時如何本地化?

  • December 25, 2013

我已經掙扎了幾個小時了,沒有好的結果。我正在嘗試使用 .NET JSON 序列化程序將 JSON 從 UI 來迴轉換為對象。

小數出現問題是因為我的文化標準將“,”作為小數分隔符而不是“。”。我試過實現一個自定義轉換器(見這個問題)沒有好的結果。

我還檢查了 NewtonSoft JSON.net 沒有更好的結果。到目前為止,與值類型的匹配似乎是文化不變的。我想覆蓋這種行為,怎麼做?

順便說一句,我真的希望避免在 javascript 方面進行本地化。我絕對希望 .NET 來處理跨文化格式和本地化,我不認為應該有像我在這個序列化程序中發現的例外,我的猜測是應該有一個正確的方法來做到這一點。

提前致謝。

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

引用自:https://stackoverflow.com/questions/4721143