Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略来自Nancy FX的json响应中的空值_Json_Nancy - Fatal编程技术网

忽略来自Nancy FX的json响应中的空值

忽略来自Nancy FX的json响应中的空值,json,nancy,Json,Nancy,我正在尝试在C#环境中使用Nancy FX创建REST服务。我可以很容易地做一个Response.AsJson,一切看起来都很好。但是我希望响应忽略任何空属性 我还不知道怎么做 有人可以指给我看一个帮助文档或某个地方的博客帖子,说明如何做到这一点 谢谢, JP我将创建一个动态匿名类型并返回它。假设您有一个User对象,如下所示: public class User { public string Id { get; set; } public string FirstName {

我正在尝试在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; }
}
Get["/user/{userid}"] = parameters =>
{
    var user = UserService.GetById(Db, (string)parameters.userid);
    if (user == null) return HttpStatusCode.UnprocessableEntity;

    return Response.AsJson(user);
};
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);
    };
您希望将此类型的实例作为JSON响应传回,因此您将获得如下代码:

public class User 
{
   public string Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
}
Get["/user/{userid}"] = parameters =>
{
    var user = UserService.GetById(Db, (string)parameters.userid);
    if (user == null) return HttpStatusCode.UnprocessableEntity;

    return Response.AsJson(user);
};
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);
    };
但是,您不希望返回
用户
实例,而是希望返回一个
动态
类型的单独实例,该实例仅在给定实例的属性值不为
null时才会实现属性

因此,我建议编写如下代码:

public class User 
{
   public string Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
}
Get["/user/{userid}"] = parameters =>
{
    var user = UserService.GetById(Db, (string)parameters.userid);
    if (user == null) return HttpStatusCode.UnprocessableEntity;

    return Response.AsJson(user);
};
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 您需要使用
动态
类型,以便可以包含特殊属性。问题是扩展方法不能接受动态类型。为了避免这种情况,您需要将其声明为
expandooobject
,但将其用作动态对象。此技巧会产生处理开销,但它允许您在将动态对象传递到
AsJson()
扩展方法时将其强制转换为
expandooobject