【问题标题】:.NET Core: Remove empty array from Json response.NET Core:从 Json 响应中删除空数组
【发布时间】:2018-09-27 12:31:45
【问题描述】:

我遇到了与 Json 响应相关的问题。 以下是响应示例:

public class ContentModel
{
    public int? Total { get; set; }
    public IEnumerable<ContentResultModel> Results { get; set; }
    public FullContentModel Result { get; set; } 
    public IEnumerable<PaginationModel> Pagination { get; set; }

    public IEnumerable<ContentCommentsModel> Comments { get; set; }
}

我不希望分页出现在响应中,如果它是空的。例如,当它为空时,我使用:

options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

有没有类似的东西可以解决我的问题?我已经搜索过了,几乎每个人都使用正则表达式,但我想避免这种情况,并希望尽可能使用更直接、更简单的方法。

即使我说 pagination 属性为空,它总是会变为空。 谢谢。

【问题讨论】:

  • 我怀疑您在搜索生成字符串后处理字符串的答案。 JSON.NET 虽然包含 很多 扩展点,允许您自定义事物的序列化方式
  • @DanielBeckmann 我认为不是。因为我不想每次需要时都继续这样做。而且会很多:\(如果我理解正确的话)
  • @BernardoF.Coelho 最后一个答案实际上涵盖了您的情况。
  • @PanagiotisKanavos 从我看到的情况来看,它对我有帮助,但是,我不想让 JsonConvert.SerializeObject(someObject, JsonSettings);每一次。那是我的问题。我的 API 很大,我想在启动时添加一些东西,可以在全球范围内更新。

标签: c# .net json .net-core


【解决方案1】:

您可以使用ShouldSerialize 方法轻松扩展您的类定义,以在列表为空时省略Pagination 属性。您可以在Json.Net docs找到更多信息。

public class ContentModel
{
    public int? Total { get; set; }
    public IEnumerable<ContentResultModel> Results { get; set; }
    public FullContentModel Result { get; set; } 
    public IEnumerable<PaginationModel> Pagination { get; set; }

    public IEnumerable<ContentCommentsModel> Comments { get; set; }

    public bool ShouldSerializePagination()
    {
        // don't serialize the Pagination property, when the list is empty
        return Pagination != null && Pagination.Count() > 0;
    }
}

示例用法:然后您可以在 ApiController 中返回 ContentModel 类型的对象,并且当列表为 null 或为空时,分页属性将不会出现在 JSON 响应中。

[HttpGet]
public ActionResult<ContentModel> Get()
{
    var model = new ContentModel
    {
        Total = 12
    };

    return Ok(model);
}

【讨论】:

  • 丹尼尔那个例子对我不起作用......我检查了文档,不同的是他们使用 JsonConvert.SerializeObject,我返回 Json(object)。
  • 您是否在使用 ASP.NET WebAPI 并从 ApiController 返回 ContentModel?或者你是怎么处理的?
  • 我正在使用 .net core 2.1 web api,我这样使用:“return StatusCode(200, contentModel);”
  • 添加了一个例子。还有.net core 2.1。
  • 可能值得一提的是,有一个选项意味着您可以将“应该序列化”的关注点分离到它自己的类中,从而维护 SoC。这是一个示例:stackoverflow.com/questions/34903151/…
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多