2011-01-18 13 views
11

私は数時間苦労していますが、いい結果はありません。私はJSONをUIからオブジェクトに変換するために.NET JSONシリアライザを使用しようとしています。JSONのシリアル化時にローカライズする方法は?

私の文化の標準には "。"ではなく小数点の区切り記号として "、"が付いているので、小数点で問題が発生します。私は良い結果でカスタムコンバータ(this質問を参照してください)を実装しようとしました。

また、私はNewtonSoft JSON.netをチェックアウトしましたが、良い結果は得られませんでした。これまでは、値の型とのマッチングは不変的にカルチャで行われていたようです。私はこの動作をオーバーライドしたい、それを行う方法?

ところで、私は本当にJavaScript側のローカライズを避けたいと考えています。私は間違いなく.NETでクロスカルチャの書式設定とローカライズをしたいと思っています。私はこのシリアライザで見つけたような例外があるはずはないと私は考えています。

ありがとうございます。

答えて

11

10進値をシリアル化するための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

ありがとうございます答えに時間をとるためのロット。質問は少し古いですが、私はまだこれらの問題に近づける方法を学ぶことに感謝しています。再度、感謝します! – Alpha

+1

喜んで助けてください。明けましておめでとうございます! –

1

あなたの現在のスレッドののCurrentCultureCurrentUICultureの性質上、適切のCultureInfoを設定していますか?

+0

。問題は、JavaScriptSerializer(http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx)がCulture.InvariantCultureで機能することです。なぜダニー? – Alpha

+0

MicrosoftのjQueryグローバリゼーションプラグインをご覧ください。http://weblogs.asp.net/scottgu/archive/2010/06/10/jquery-globalization-plugin-from-microsoft.aspx –

関連する問題