如何忽略来自asmx的JSON响应中的空值

时间:2014-02-02 22:51:06

标签: c# jquery json asmx

我有简单的 asmx返回JSON:

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class myWebService: System.Web.Services.WebService
    {

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public MyCustomClassObject GetTestData()
    {
        MyCustomClassObject x = new MyCustomClassObject();
        x.PropertyA = "1";
        x.PropertyC = "1";
        return x;
    }

c#类定义:

 public class MyCustomClassObject 
    {
        public string PropertyA { get; set; }
        public string PropertyB { get; set; }
        public string PropertyC { get; set; }
        public object PropertyD { get; set; }
    }

使用jquery $ .ajax调用:

 var jqxhr = $.ajax(
                {
                    type: 'POST',
                    contentType: "application/json; charset=utf-8",
                    url: "/WebServices/myWebService.asmx/GetTestData",
                    data: parameters,
                    dataType: "json",
                    success: successLoadingData,
                    error: errorLoadingData,
                    complete: function () { $("#LoadingImage").hide(); }
                });

我的JSON响应(包含不需要的空值):

  

{ “PropertyA”: “1”, “PropertyB”:NULL, “PropertyC”: “1”, “PropertyD”:空}

问题: 我如何仅使用尽可能多的JSON来获取非空属性?

我在这里看到了一些答案,其中人们返回JSON对象和使用JSON属性定义的属性但我只是返回我的对象​​而web服务正在将它转换为JSON(由于Response.Format属性) 。如果必须,我将改变我的方法,但它是我的第一个JSON项目,所以希望保持简单。感谢。

2 个答案:

答案 0 :(得分:2)

继续评论部分。 即使你调用一个函数来删除空值,我个人对它的看法是设计不好,有一个字典和序列化比一个更优雅的方式比我们不需要删除我们不想要的属性完成。

我会做的是这样的事情:

public class MyCustomClassObject 
{
    public Dictionary<string, object> Foo { get; set; }

    public MyCustomClassObject()
    {
        this.Foo = new Dictionary<string, object>();
    }

}

public MyCustomClassObject GetTestData()
{
    MyCustomClassObject x = new MyCustomClassObject();
    x.Foo.Add("PropertyA", 2);
    x.Foo.Add("PropertyC", "3");
    return x.Foo;
}

这为您提供了一个更通用的对象,可以更好地使用和遵循JSON格式,因为理论上您可以将对象的列表或数组作为值,这也更适合使用,因为您可以在此处添加PropertyD

为什么在添加值后需要删除值的东西?

答案 1 :(得分:1)

您可以递归删除null的属性,这是一个执行此操作的代码段:

function removeNulls(obj){
    var res = {};
    for(var key in obj){
        if (obj[key] !== null && typeof obj[key] == "object")
            res[key] = removeNulls(obj[key]);
        else if(obj[key] !== null)
            res[key] = obj[key];        
    }
    return res;
};

用法为removeNulls(jsonResult)

在行动here

中查看