当前位置: 首页 > 知识库问答 >
问题:

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

贝阳泽
2023-03-14

我有简单的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”:null}

问:如何仅使用JSON中的非空属性,尽可能多地使用我已经拥有的内容?

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

共有2个答案

林修真
2023-03-14

您可以递归地删除为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)

在此处查看它的实际操作

戴品
2023-03-14

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

我会这样做:

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格式,因为理论上您可以将对象列表或数组作为值,这也更适合使用,因为您可以在此处添加Property tyD。

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

 类似资料:
  • 我想从我的响应中排除name和age,但是当我收到JSON有效载荷请求时,我需要name和age字段-在我的业务逻辑之后,我想发送状态和消息作为JSON响应的一部分。姓名和年龄应该排除在外。我如何在Java中实现这一点? 我的控制器类:

  • 问题内容: 我正在使用RestEasy并hibernate以返回Jackson的响应。我有一个bean播放器,具有以下字段:名称,id,年龄,位置。 现在,我正在实现两种重现json的rest方法。 ,这将返回一名玩家:姓名,身份证,年龄,位置。 ,这将返回玩家列表,但是有了这个玩家列表,我不想返回位置。 我的意思是,我该如何为一个响应添加一个字段,而对另一个响应忽略它。 请提出建议。 谢谢 问题

  • 问题内容: 我有以下方法: 在这里,我将ResponseFormat属性设置为json,但仍将其作为XML返回。 我想使用此asmx服务进行json格式化有什么想法吗? 问题答案: 我遇到了同样的问题,并包含以下代码以使其正常工作。 更新: 要获得纯json格式,您可以使用如下的javascript序列化程序。 但是,这适用于复杂类型,但字符串没有任何区别。

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 和使用它的字段: 当使用Solr分析工具时,一切看起来都很好。 查询部分如下: null null