2009-06-22 13 views
10

J'ai une fonction avec un type de retour de liste. J'utilise cela dans un JSON compatible WebService comme:JavaScriptSerializer avec le type personnalisé

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

ce retour:

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

Je dois utiliser ce code dans un simple fichier ASPX, donc je créé 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(); 

mais il retourne sans un type:

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

Est-ce que quelqu'un a la moindre idée de comment faire fonctionner la deuxième sérialisation comme la première?

Merci!

Répondre

3

Ok, j'ai la solution, je l'ai ajouté manuellement le __type à la collection dans la classe 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; 
    } 
} 

Y at-il "offical" façon de le faire? :)

+0

cool! ça m'aide. Merci :) –

16

Lorsque vous créez le JavaScriptSerializer, le passer, une instance de SimpleTypeResolver.

new JavaScriptSerializer(new SimpleTypeResolver()) 

Pas besoin de créer votre propre JavaScriptConverter.

+0

merci, c'est vraiment une solution plus élégante :) – balint

+0

Une idée de la façon dont je peux renommer la propriété "_type" pour supprimer le trait de soulignement? – reddy

2

Miser sur la réponse de Joshua, vous devez mettre en œuvre un SimpleTypeResolver

Voici la façon « officielle » qui a fonctionné pour moi.

1) Créer cette 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) Utilisez-le pour sérialiser

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) Utilisez-le pour désérialiser

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

poste complet ici: http://www.agilechai.com/content/serialize-and-deserialize-to-json-from-asp-net/

+0

sharpdeveloper.net est mort. Il est tellement ennuyeux et frustrant quand on cherche un problème pour avoir une solution à un problème de connexion. S'il vous plaît les gens! Il suffit de copier/coller les informations ici! –

+0

@ JayRO-GreyBeard a corrigé le lien – Sameer