2009-06-22 17 views
10

के साथ जावास्क्रिप्टसेरियलाइज़र मेरे पास एक सूची रिटर्न प्रकार के साथ एक फ़ंक्शन है।कस्टम टाइप

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

इस रिटर्न:: मैं की तरह एक JSON-सक्षम WebService में इस का उपयोग कर रहा

{"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

ठीक है, मैं समाधान है, मैं मैन्युअल JavaScriptConverter कक्षा में संग्रह करने के लिए __type जोड़ दिया है।

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

ठंडा! इससे मुझे मदद मिलती है। धन्यवाद :) –

16

जब आप JavaScriptSerializer बनाते हैं तो वह SimpleTypeResolver का एक उदाहरण गुजरती हैं।

new JavaScriptSerializer(new SimpleTypeResolver()) 

अपनी खुद की जावास्क्रिप्ट कनवर्टर बनाने की कोई आवश्यकता नहीं है।

+0

धन्यवाद, यह वास्तव में एक और अधिक सुरुचिपूर्ण समाधान है :) – balint

+0

अंडरस्कोर को हटाने के लिए मैं "_type" संपत्ति का नाम कैसे बदल सकता हूं? – reddy

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) deserialize करने के लिए

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/

+0

sharpdeveloper.net मर चुका है। एक टूटी हुई लिंक पर संभावित रूप से सिरदर्द को हल करने के लिए किसी समस्या के माध्यम से घूमते समय यह बहुत परेशान और निराशाजनक होता है। कृपया लोग! बस यहां जानकारी कॉपी/पेस्ट करें! –

+0

@ जेरो-ग्रेबीर्ड ने लिंक तय किया – Sameer

संबंधित मुद्दे