2009-06-22 12 views
10

Ich habe eine Funktion mit einem List-Rückgabetyp. Ich verwende diese in einem JSON-fähigen WebService wie:JavaScriptSerializer mit benutzerdefinierten Typ

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

dies zurück:

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

Ich brauche auch diesen Code in einer einfachen aspx-Datei zu verwenden, so dass ich erstellt ein 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(); 

aber es gibt ohne Typ:

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

Hat jemand eine Ahnung, wie man die zweite Serialisierung Arbeit wie die erste bekommen?

Danke!

Antwort

3

Ok, habe ich die Lösung habe ich manuell die __type zu der Sammlung in der Javascript Klasse hinzugefügt.

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; 
    } 
} 

Gibt es eine „offizielle“ Weg, dies zu tun? :)

+0

cool! es hilft mir. Danke :) –

16

Wenn Sie die JavaScriptSerializer erstellen, ist es eine Instanz von SimpleTypeResolver passieren.

new JavaScriptSerializer(new SimpleTypeResolver()) 

Keine Notwendigkeit, Ihren eigenen JavaScriptConverter zu erstellen.

+0

danke, das ist wirklich eine elegantere Lösung :) – balint

+0

Irgendeine Idee, wie ich die Eigenschaft "_type" umbenennen kann, um den Unterstrich zu entfernen? – reddy

2

Aufbauend auf Joshua Antwort, müssen Sie eine SimpleTypeResolver

hier implementieren ist die „offizielle“ Weg, der für mich gearbeitet.

1) Erstellen Sie diese Klasse

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) Verwenden Sie es

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) Verwenden Sie es serialisiert

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

Den ganzen Beitrag deserialisieren hier: http://www.agilechai.com/content/serialize-and-deserialize-to-json-from-asp-net/

+0

sharpdeveloper.net ist tot. Es ist so sehr ärgerlich und frustrierend, wenn man durch ein Problem stolpert, um eine potentiell Kopfschmerzen lösende Antwort auf eine defekte Verbindung zu haben. Bitte Leute! Einfach die Info hier kopieren/einfügen! –

+0

@ JayRO-GreyBeard hat den Link repariert – Sameer

Verwandte Themen