在Nancy FX中忽略json响应中的空值

时间:2013-02-18 12:40:56

标签: json nancy

我正在尝试在C#环境中使用Nancy FX创建REST服务。我可以很容易地做一个Response.AsJson,它看起来都很好。但我希望响应省略任何null属性。

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

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

谢谢, JP

1 个答案:

答案 0 :(得分:3)

我会创建一个动态匿名类型并返回它。所以假设你有一个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类型的单独实例,如果属性值不是{{1,则只实现属性对于给定的实例。

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

null

注1 您不需要测试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); }; ,因为Id实例从数据库中成功返回就暗示了这一点。

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