2009-06-22 43 views
10

Tôi có một hàm có loại trả về Danh sách. Tôi đang sử dụng này trong WebService JSON cho phép như:JavaScriptSerializer với loại tùy chỉnh

[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(); 
    } 

này trả về:

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

tôi cần phải sử dụng mã này trong một tập tin aspx đơn giản quá, vì vậy tôi tạo ra một 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(); 

nhưng nó sẽ trả về mà không có một loại:

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

Có ai có bất kỳ đầu mối nào về cách làm cho chuỗi thứ hai hoạt động như lần đầu tiên không?

Cảm ơn!

Trả lời

3

Ok, tôi có giải pháp, tôi đã thêm thủ công __type vào bộ sưu tập trong lớp học 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; 
    } 
} 

Có bất kỳ "chính thức" cách để làm điều này? :)

+0

mát mẻ! nó giúp tôi. Cảm ơn bạn :) –

16

Khi bạn tạo các JavaScriptSerializer, vượt qua nó một thể hiện của SimpleTypeResolver.

new JavaScriptSerializer(new SimpleTypeResolver()) 

Không cần tạo JavaScriptConverter của riêng bạn.

+0

cảm ơn, đó thực sự là một giải pháp thanh lịch hơn :) – balint

+0

Bất kỳ ý tưởng nào về cách tôi có thể đổi tên thuộc tính "_type" để xóa dấu gạch dưới? – reddy

2

Xây dựng dựa trên câu trả lời của Joshua, bạn cần triển khai SimpleTypeResolver

Đây là cách "chính thức" phù hợp với tôi.

1) Tạo lớp này

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) Sử dụng nó để serialize

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) Sử dụng nó để deserialize

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

Full bài ở đây: http://www.agilechai.com/content/serialize-and-deserialize-to-json-from-asp-net/

+0

sharpdeveloper.net đã chết. Nó là rất khó chịu và bực bội khi slogging thông qua một vấn đề để có một câu trả lời có khả năng đau đầu giải quyết trên một liên kết bị hỏng. Xin mọi người! Chỉ cần sao chép/dán thông tin ở đây! –

+0

@ JayRO-GreyBeard đã sửa liên kết – Sameer

Các vấn đề liên quan