具有自定义类型的JavaScriptSerializer

bal*_*int 10 asp.net javascriptserializer

我有一个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();
    }
Run Code Online (Sandbox Code Playgroud)

这会返回:

{"d":[{"__type":"Product","Id":"2316","Name":"Big Something ","Price":"3000","Quantity":"5"}]}
Run Code Online (Sandbox Code Playgroud)

我需要在一个简单的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();
Run Code Online (Sandbox Code Playgroud)

但它返回没有类型:

[{"Id":"2316","Name":"Big One ","Price":"3000","Quantity":"5"}]
Run Code Online (Sandbox Code Playgroud)

有没有人有任何线索如何让第二个序列化像第一个一样工作?

谢谢!

Jos*_*gan 16

创建JavaScriptSerializer时,将其传递给SimpleTypeResolver的实例.

new JavaScriptSerializer(new SimpleTypeResolver())
Run Code Online (Sandbox Code Playgroud)

无需创建自己的JavaScriptConverter.


bal*_*int 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有任何“官方”方法可以做到这一点?:)