3

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

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

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

谢谢,JP

4

1 回答 1

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时才实现属性。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类型,以便您可以包含临时属性。问题是扩展方法不能接受动态类型。为避免这种情况,您需要将其声明为ExpandoObject但将其用作动态。这个技巧会产生处理开销,但它允许您在将动态ExpandoObject传递给AsJson()扩展方法时将其强制转换为。

于 2013-02-19T11:50:16.803 回答