2009-06-22 97 views
10

我有一個List返回類型的函數。我在支持JSON,WebService的使用此類似:JavaScriptSerializer與自定義類型

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public List<Product> GetProducts(string dummy) /* without a parameter, it will not go through */ 
    { 
     return new x.GetProducts(); 
    } 

這將返回:

{"d":[{"__type":"Product","Id":"2316","Name":"Big Something ","Price":"3000","Quantity":"5"}]} 

我需要一個簡單的aspx文件也使用此代碼,所以我創建一個JavaScriptSerializer:

 JavaScriptSerializer js = new JavaScriptSerializer(); 
     StringBuilder sb = new StringBuilder(); 

     List<Product> products = base.GetProducts(); 
     js.RegisterConverters(new JavaScriptConverter[] { new ProductConverter() }); 
     js.Serialize(products, sb); 

     string _jsonShopbasket = sb.ToString(); 

但它返回無類型:

[{"Id":"2316","Name":"Big One ","Price":"3000","Quantity":"5"}] 

有沒有人有任何線索如何獲得像第一個第二序列化工作?

謝謝!

回答

3

好吧,我有解決方案,我已經手動添加的__type到集合中的JavaScriptConverter類。

public class ProductConverter : JavaScriptConverter 
{  public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     Product p = obj as Product; 
     if (p == null) 
     { 
      throw new InvalidOperationException("object must be of the Product type"); 
     } 

     IDictionary<string, object> json = new Dictionary<string, object>(); 
     json.Add("__type", "Product"); 
     json.Add("Id", p.Id); 
     json.Add("Name", p.Name); 
     json.Add("Price", p.Price); 

     return json; 
    } 
} 

是否有任何「官方」的方式來做到這一點?:)

+0

涼!它幫助到我。謝謝:) – 2011-07-30 10:34:03

16

當您創建的JavaScriptSerializer,通過它SimpleTypeResolver的一個實例。

new JavaScriptSerializer(new SimpleTypeResolver()) 

無需創建自己的JavaScript轉換器。

+0

謝謝,這真是一個更優雅的解決方案:) – balint 2011-02-14 12:19:23

+0

任何想法,我可以重命名「_type」屬性以刪除下劃線? – reddy 2015-10-10 10:07:41

2

大廈約書亞的答案,你需要實現一個SimpleTypeResolver

這裏是「官方」的方式爲我工作。

1)創建這個類

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

namespace XYZ.Util 
{ 
    /// <summary> 
    /// as __type is missing ,we need to add this 
    /// </summary> 
    public class ManualResolver : SimpleTypeResolver 
    { 
     public ManualResolver() { } 
     public override Type ResolveType(string id) 
     { 
      return System.Web.Compilation.BuildManager.GetType(id, false); 
     } 
    } 
} 

2)使用它序列

var s = new System.Web.Script.Serialization.JavaScriptSerializer(new XYZ.Util.ManualResolver()); 
string resultJs = s.Serialize(result); 
lblJs.Text = string.Format("<script>var resultObj = {0};</script>", resultJs); 

3)用它來反序列化

System.Web.Script.Serialization.JavaScriptSerializer(new XYZ.Util.ManualResolver()); 
var result = json.Deserialize<ShoppingCartItem[]>(jsonItemArray); 

全部張貼在這裏:http://www.agilechai.com/content/serialize-and-deserialize-to-json-from-asp-net/