【发布时间】:2017-06-23 18:16:35
【问题描述】:
我正在尝试在 C# 环境中使用 Nancy FX 创建 REST 服务。我可以轻松地做一个 Response.AsJson 并且一切看起来都不错。但我希望响应省略任何为空的属性。
我还没有弄清楚如何做到这一点。
有人可以指点我指向某个地方的帮助文档或博客文章,它解释了如何执行此操作。
谢谢, JP
【问题讨论】:
我正在尝试在 C# 环境中使用 Nancy FX 创建 REST 服务。我可以轻松地做一个 Response.AsJson 并且一切看起来都不错。但我希望响应省略任何为空的属性。
我还没有弄清楚如何做到这一点。
有人可以指点我指向某个地方的帮助文档或博客文章,它解释了如何执行此操作。
谢谢, JP
【问题讨论】:
我会创建一个动态匿名类型并返回它。所以假设你有一个像这样的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。
【讨论】: