【问题标题】:JavaScriptSerializer with custom Type具有自定义类型的 JavaScriptSerializer
【发布时间】:2009-06-22 13:03:51
【问题描述】:

我有一个返回类型为 List 的函数。我在启用 JSON 的 WebService 中使用它,例如:

  [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"}]

有没有人知道如何让第二个序列化工作像第一个一样?

谢谢!

【问题讨论】:

    标签: asp.net javascriptserializer


    【解决方案1】:

    当您创建 JavaScriptSerializer 时,将 SimpleTypeResolver 的实例传递给它。

    new JavaScriptSerializer(new SimpleTypeResolver())
    

    无需创建自己的 JavaScriptConverter。

    【讨论】:

    • 知道如何重命名“_type”属性以删除下划线吗?
    【解决方案2】:

    好的,我有解决方案,我已手动将 __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;
        }
    }
    

    有没有“官方”的方式来做到这一点?:)

    【讨论】:

      【解决方案3】:

      基于 Joshua 的回答,您需要实现一个 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/

      【讨论】:

      • sharpdeveloper.net 已死。当苦苦解决问题以在断开的链接上解决可能令人头疼的问题时,这是非常烦人和令人沮丧的。请人!只需在此处复制/粘贴信息!
      • @JayRO-GreyBeard 修复了链接
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2011-03-20
      • 2017-04-06
      相关资源
      最近更新 更多