【问题标题】:Omit null values in json response from Nancy FX在 Nancy FX 的 json 响应中省略空值
【发布时间】:2017-06-23 18:16:35
【问题描述】:

我正在尝试在 C# 环境中使用 Nancy FX 创建 REST 服务。我可以轻松地做一个 Response.AsJson 并且一切看起来都不错。但我希望响应省略任何为空的属性。

我还没有弄清楚如何做到这一点。

有人可以指点我指向某个地方的帮助文档或博客文章,它解释了如何执行此操作。

谢谢, JP

【问题讨论】:

    标签: json nancy


    【解决方案1】:

    我会创建一个动态匿名类型并返回它。所以假设你有一个像这样的User 对象:

    public class User 
    {
       public string Id { get; set; }
       public string FirstName { get; set; }
       public string LastName { get; set; }
    }
    

    您希望将此类型的实例作为 JSON 响应传回,因此您将获得如下代码:

    Get["/user/{userid}"] = parameters =>
    {
        var user = UserService.GetById(Db, (string)parameters.userid);
        if (user == null) return HttpStatusCode.UnprocessableEntity;
    
        return Response.AsJson(user);
    };
    

    但是您不想返回 User 实例,而是希望返回 dynamic 类型的单独实例,该实例仅在给定实例的属性值不是 null 时才实现属性.

    所以我会建议这样的代码:

    Get["/user/{userid}"] = parameters =>
        {
            var user = UserService.GetById(Db, (string)parameters.userid);
            if (user == null) return HttpStatusCode.UnprocessableEntity;
    
            dynamic userDTO = new ExpandoObject();
            userDTO.Id = user.Id;
            if (!string.IsNullOrEmpty(user.FirstName)) userDTO.FirstName = user.FirstName;
            if (!string.IsNullOrEmpty(user.LastName)) userDTO.Lastname = user.LastName;
    
            return Response.AsJson((ExpandoObject)userDTO);
        };
    

    注意 1 您无需测试 Id,因为从数据库成功返回 User 实例暗示了这一点。

    注意 2 您需要使用 dynamic 类型,以便包含 ad hoc 属性。问题是扩展方法不能接受动态类型。为避免这种情况,您需要将其声明为ExpandoObject,但将其用作动态。这个技巧会产生处理开销,但它允许您在将动态传递给AsJson() 扩展方法时将其转换为ExpandoObject

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多