2011-10-24 5 views
0

どのようにしてCultureSerializerを使用するようにSystem.Web.ExtensionsからJavaScriptSerializerを取得しますか?JavaScriptSerializerがCultureInfo.CurrentCultureを使用していません

DD/MM/YYYY DateTimesをデシリアライズする例外が発生していますが、現在のところ、私たちのアプリケーションでは間違っている米国のフォーマットであることが予想されます。 JavaScriptSerializerのMDSNノートパー

答えて

1

DateオブジェクトとしてJSONで表現 "/日(ティック数)/"。ティック数は、UTC 1970年1月1日0時から経過したティック(ミリ秒)の数を示す正または負のlong値です。

サポートされている日付の最大値はMaxValue(12/31/9999 11:59:59 PM)で、最小値はMinValue(1/1/0001 12:00:00 AM)です。あなたのタイプを処理するDateTimeためJavaScriptConverterを登録する必要があります

public class DateTimeConverter : JavaScriptConverter 
{ 

    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     if (dictionary == null) 
      throw new ArgumentNullException("dictionary"); 

     if (type == typeof(DateTime)) 
     { 
      DateTime time; 
      time = DateTime.Parse(dictionary["Time"].ToString(), /** put your culture info here **/); 

      return time; 
     } 

     return null; 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     DateTime? time = obj as DateTime?; 

     if (time == null) 
     { 
      Dictionary<string, object> result = new Dictionary<string, object>(); 
      result["Time"] = time.Value; 

      return result; 
     } 

     return new Dictionary<string, object>(); 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(DateTime) })); } 
    } 
} 

クマ心の中であなたのJSONが、実際にオブジェクトのプロパティ名の面で持っています何のために考慮する必要があります(あなたはおそらく "時間"以外の名前を使用しています)。

ことはあなたのJavaScriptSerializerでそれを登録します。

serializer.RegisterConverters(new List<JavaScriptConverter>() { new DateTimeConverter() }); 

最後に、そこに行うことができますより多くのだ、これは上構築するための唯一の例であることに注意してください。明示的に、 "Time"という名前の辞書項目を検索しており、解析の失敗を処理していません。 DateTimeを使用するフィールドには、複数の名前があります。

+0

答えをありがとう! 2つの質問:シリアル化された結果をプリミティブ型で表すことは可能ですか?私。 Timeプロパティで別のオブジェクトの中にラップされていないのですか?また、コンバータがSupportedTypesプロパティのすべての派生型を処理する方法を認識していますか?特定のインタフェースを特定の方法でシリアル化するためにこの機能を使用したいと思っています。 –

+0

あなたの最初の質問に対する答えがわかりません。特別に処理したいタイプの場合は、コンバータを作成して上記と同じように登録する必要があります。 – doctorless

関連する問題