2010-11-11 56 views
1
  1. 使用JavaScriptSerializer進行序列化時,可以忽略該類的某些字段?有關JavaScriptSerializer的一些問題

  2. 使用JavaScriptSerializer進行序列化時,我們是否可以更改字段的名稱? 例如,該字段是字符串is_OK,但我希望它被映射到isOK?

回答

6

對於最大的靈活性(因爲你提到的名字一樣),理想的是調用RegisterConvertersJavaScriptSerializer對象上,註冊一個或更多JavaScriptConverter實現(可能在數組或迭代器塊中)。

然後,您可以實施Serialize,通過向您返回的詞典添加鍵/值對,在任何名稱下添加(或不)和值。如果數據是雙向的,你也需要匹配Deserialize,但通常(對於Ajax服務器),這不是必需的。

完整的示例:

using System; 
using System.Collections.Generic; 
using System.Web.Script.Serialization; 
class Foo 
{ 
    public string Name { get; set; } 
    public bool ImAHappyCamper { get; set; } 
    private class FooConverter : JavaScriptConverter 
    { 
     public override object Deserialize(System.Collections.Generic.IDictionary<string, object> dictionary, System.Type type, JavaScriptSerializer serializer) 
     { 
      throw new NotImplementedException(); 
     } 
     public override System.Collections.Generic.IEnumerable<System.Type> SupportedTypes 
     { 
      get { yield return typeof(Foo); } 
     } 
     public override System.Collections.Generic.IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
     { 
      var data = new Dictionary<string, object>(); 
      Foo foo = (Foo)obj; 
      if (foo.ImAHappyCamper) data.Add("isOk", foo.ImAHappyCamper); 
      if(!string.IsNullOrEmpty(foo.Name)) data.Add("name", foo.Name); 
      return data; 
     } 
    } 
    private static JavaScriptSerializer serializer; 
    public static JavaScriptSerializer Serializer { 
     get { 
      if(serializer == null) { 
       var tmp = new JavaScriptSerializer(); 
       tmp.RegisterConverters(new [] {new FooConverter()}); 
       serializer = tmp; 
      } 
      return serializer; 
     } 
    } 
} 
static class Program { 
    static void Main() 
    { 
     var obj = new Foo { ImAHappyCamper = true, Name = "Fred" }; 
     string s = Foo.Serializer.Serialize(obj); 
    } 
} 
12

您可以使用[ScriptIgnore]跳過一個屬性:

using System; 
using System.Web.Script.Serialization; 

public class Group 
{ 
    // The JavaScriptSerializer ignores this field. 
    [ScriptIgnore] 
    public string Comment; 

    // The JavaScriptSerializer serializes this field. 
    public string GroupName; 
}