2011-11-16 44 views
0

有沒有辦法用JavaScriptSerializer(我不想在此時使用另一個庫)在哪裏可以做到這樣的事情?JavaScriptSerializer從JavaScript字符串或數組反序列化爲.NET字符串[]

class Model 
{ 
    string[] Values { get; set; } 
} 

// using the serializer 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

// this works 
Model workingModel = serializer.Deserialize<Model>("{ Values : ['1234', '2346'] }"); 

// this works 
Model wontWorkModel = serializer.Deserialize<Model>("{ Values : 'test' }"); 

我想wontWorkModel.Values爲與1個項目的陣列 - test

這是可能與我指定的JSON?

編輯

我能夠在使用TypeConverter並將其插入到的string[]類型破解這一點,但它似乎很hackish的(和可怕的,我可以做,在.NET)。

+0

我有正是這個問題,並且正在尋找這個TypeConverter,感覺就像是正確的解決方案;)它不像你能夠對.net只做你的小宇宙那樣做 - 但是代碼示例當然是可愛的:D –

回答

0

爲什麼不能簡單地用

Model wontWorkModel = serializer.Deserialize<Model>("{ Values : ['test'] }"); 
+0

我不能保證它是一個數組或不。一些JavaScript框架非常聰明,可以自動將其推廣到一個數組。 –

+0

毫米該模型有一個數組,所以你必須反序列化到另一個對象,我會做的是搜索'['如果它有,反序列化ModelWithArray,如果不是ModelWithString,我知道不是你在找什麼但我認爲沒有辦法反序列化到一個匿名對象或類似的東西 –

1

一種選擇是創建一個JavascriptConverter像這樣:

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

      if (type == typeof(Model)) 
      { 
       Model result = new Model(); 
       foreach (var item in dictionary.Keys) 
       { 
        if (dictionary[item] is string && item == "Values") 
         result.Values = new string[] { (string)dictionary[item] }; 
        else if(item=="Values") 
         result.Values = (string[])((ArrayList)dictionary[item]).ToArray(typeof(string)); 

       } 
       return result; 
      } 
      return null; 
     } 

     public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 

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

你可以這樣調用:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

ModelConverter sc = new ModelConverter(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ModelConverter() }); 


Model workingModel = serializer.Deserialize<Model>("{ Values : '2346' }"); 
Model workingModel1 = serializer.Deserialize<Model>("{ Values : ['2346'] }"); 
Model workingModel2 = serializer.Deserialize<Model>("{ Values : ['2346','3123'] }"); 

這裏的MSDN documentation for JavascriptConverter

+0

我希望這個工作在一般意義上。 –

相關問題