如何返回一个空的JSON结果?

jgovgodb  于 2023-02-01  发布在  其他
关注(0)|答案(5)|浏览(207)

我有一个 AJAX 调用,它向我的一个控制器动作方法发出GET请求。
AJAX 调用应该得到一个JSON响应,并使用它来填充一个数据网格,回调函数应该触发并构造网格,并隐藏加载指示符。

$.getJSON('@Url.Action("Data", "PortfolioManager")' + '?gridName=revenueMyBacklogGrid&loginName=@Model.currentUser.Login', function (data) {

                        ConstructrevenueMyBacklogGrid(data);
                        $('#revenueMyBacklogLoadingIndicator').hide();

                    });

问题是当我转换为JsonResult对象的对象没有数据时-它只是一个空集合。
returnJsonResult = Json(投资组合管理器门户数据.销售数据.我的本年销售客户,Json请求行为.允许获取);
在这个例子中,返回空值的是myYTDSalesClients集合(这是可以的,也是有效的--有时候不会有任何数据)。
然后JSON对象返回一个空响应(blank,nadda),由于它不是有效的JSON,回调函数不会触发,因此加载指示符仍然显示,看起来像是永远加载。
那么,如何返回空的JSON结果{}而不是空白呢?

vhipe2zx

vhipe2zx1#

从asp.netmvc 5开始,您可以简单地编写:

Json(new EmptyResult(), JsonRequestBehavior.AllowGet)
ac1kyiln

ac1kyiln2#

if (portfolioManagerPortalData.salesData.myYTDSalesClients == null) {
    returnJsonResult = Json(new object[] { new object() }, JsonRequestBehavior.AllowGet);
}
else {
    returnJsonResult = Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet);
}
e37o9pze

e37o9pze3#

在.Net Core 3.0中,对于ControllerBase类型的控制器,您可以执行以下操作:

return new JsonResult(new object());
yvt65v4c

yvt65v4c4#

使用JSON. NET作为序列化JSON的默认序列化程序,而不是默认的Javascript序列化程序:
这将处理发送NULL数据的场景。
例如:
在您的操作方法中不使用此方法:

return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet)

你需要在你的action方法中写这个:

return Json(portfolioManagerPortalData.salesData.myYTDSalesClients, null, null);

注:上述函数中的第2、3个参数null是为了方便重载Controller类中的Json方法。
此外,您不需要像上面那样检查所有操作方法中的null:

if (portfolioManagerPortalData.salesData.myYTDSalesClients == null)
        {
            returnJsonResult = Json(new object[] { new object() }, JsonRequestBehavior.AllowGet);
        }
        else
        {
            returnJsonResult = Json(portfolioManagerPortalData.salesData.myYTDSalesClients, JsonRequestBehavior.AllowGet);
        }

下面是JsonNetResult类的代码。

public class JsonNetResult : JsonResult
{
    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }

    public JsonNetResult()
    {
        SerializerSettings = new JsonSerializerSettings();
        JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = !string.IsNullOrEmpty(ContentType)
          ? ContentType
          : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting.Indented };

        JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
        serializer.Serialize(writer, Data);

        writer.Flush();
    }
}

此外,您还需要在BaseController中添加以下代码(如果项目中有):

/// <summary>
    /// Creates a NewtonSoft.Json.JsonNetResult object that serializes the specified object to JavaScript Object Notation(JSON).
    /// </summary>
    /// <param name="data"></param>
    /// <param name="contentType"></param>
    /// <param name="contentEncoding"></param>
    /// <returns>The JSON result object that serializes the specified object to JSON format. The result object that is prepared by this method is written to the response by the ASP.NET MVC framework when the object is executed.</returns>
    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding)
    {
        return new JsonNetResult
        {
            Data = data,
            ContentType = contentType,
            ContentEncoding = contentEncoding
        };
    }
ql3eal8s

ql3eal8s5#

在ASP.NET核心WebAPI中返回空JSON {}

许多类型的响应服务器状态代码不返回内容。甚至200系列成功响应代码中的一些也不允许返回内容。您还必须在响应中返回“application/json”内容类型,以便浏览器识别JSON,否则浏览器可能会将空JSON解释为null或空字符串。这两个问题可能是您从未获得空JSON对象的原因。
因此,要使其工作,您需要:
1.返回Http头状态代码200成功
1.返回“application/json”的Http头内容类型
1.返回空JSON对象{}
好消息是ASP.NETCore7附带了几个响应对象的“ActionResult”子类型,它们可以为您完成上述所有三个步骤,尽管文档没有明确说明:

[HttpGet]
public IActionResult GetJSON(string? text = "")
{
  return new ObjectResult(new{});
}

// Returns: {}

ObjectResult是ActionResult的通用 Package 器,它能够返回任何转换为JSON(JSON内容类型)的对象,并传递状态代码200 Successful。

相关问题