2009-06-22 11 views
10

Ho una funzione con un tipo di ritorno Elenco. Sto usando questo in un WebService JSON-enabled come:JavaScriptSerializer con tipo personalizzato

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

restituisce:

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

ho bisogno di utilizzare questo codice in un semplice file aspx troppo, così ho creato un 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(); 

ma restituisce senza un tipo:

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

Qualcuno ha qualche idea su come ottenere il secondo lavoro di serializzazione come il primo?

Grazie!

risposta

3

Ok, ho la soluzione, ho aggiunto manualmente il __type alla raccolta nel classe di 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'è un modo "ufficiale" per fare questo? :)

+0

freddo! mi aiuta. Grazie :) –

16

Quando si crea il JavaScriptSerializer, passare è un esempio di SimpleTypeResolver.

new JavaScriptSerializer(new SimpleTypeResolver()) 

Non è necessario creare il proprio JavaScriptConverter.

+0

grazie, questa è davvero una soluzione più elegante :) – balint

+0

Qualche idea su come posso rinominare la proprietà "_type" per rimuovere il carattere di sottolineatura? – reddy

2

Sulla risposta di Joshua, è necessario implementare un SimpleTypeResolver

Qui è il modo "ufficiale" che ha funzionato per me.

1) Creare questa classe

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) Usarlo per serializzare

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) Usalo per deserializzare

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

articolo completo qui: http://www.agilechai.com/content/serialize-and-deserialize-to-json-from-asp-net/

+0

sharpdeveloper.net è morto. È molto fastidioso e frustrante quando si cerca di risolvere un problema con una soluzione potenzialmente mal di testa su un collegamento interrotto. Per favore gente! Basta copiare/incollare le informazioni qui! –

+0

@ JayRO-GreyBeard ha corretto il collegamento – Sameer

Problemi correlati