2009-06-22 4 views
10

У меня есть функция со списком типа возврата. Я использую это в JSON с поддержкой WebService, как:JavaScriptSerializer с пользовательским типом

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

это возвращает:

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

Хорошо, у меня есть решение, я вручную добавил __type к коллекции в классе 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; 
    } 
} 

Есть ли "Offical" способ сделать это? :)

+0

круто! помогает мне. Спасибо :) –

16

При создании JavaScriptSerializer, передать его экземпляр SimpleTypeResolver.

new JavaScriptSerializer(new SimpleTypeResolver()) 

Не нужно создавать свой собственный JavaScriptConverter.

+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) Используйте его для десериализации

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

@ JayRO-GreyBeard исправил ссылку – Sameer

Смежные вопросы