C# JSON响应自定义.NET核心Web API

C# JSON响应自定义.NET核心Web API,c#,.net,json,C#,.net,Json,我正在使用.NETCore2.2制作webapi。我是.net framework的新手,到目前为止,我一直在使用基于javascript的框架,比如nodejs expressjs 在nodejs中定制JSON响应很容易。您能解释一下如何使用.NET Core 2.2 WebApi定制JSON响应吗?给我指出正确的方向 我举个例子, C#用户模型 public class User { int id {get;set;} string name {get;set;} s

我正在使用
.NETCore2.2
制作webapi。我是.net framework的新手,到目前为止,我一直在使用基于javascript的框架,比如nodejs expressjs

在nodejs中定制JSON响应很容易。您能解释一下如何使用.NET Core 2.2 WebApi定制JSON响应吗?给我指出正确的方向

我举个例子,

C#用户模型

public class User {
    int id {get;set;}
    string name {get;set;}
    string username {get;set;}
    string password {get;set;}
}
默认API获取响应

public ActionResult<IEnumerable<User>> GetAll()
我需要像这样定制输出

{
    "statuscode": 200,
    "count"     : 2,
    "data"      : 

    [
        {
            "name": "John Doe",
            "username": "john",
        },
        {
            "name": "Jane Doe",
            "username": "jane",
        }
    ]
}

我猜您要求为您的api提供一个通用返回对象,如果是这样,您需要定义一个返回对象,如下所示:

您的返回对象模型,考虑到您的所有实体都有一个基本类型
IEntity
BaseEntity

public class Result<T> where T: IEntity
{
    public int StatusCode { get; set; }
    public int Count { get; set; }
    public IEnumerable<T> Data { get; set; }
}
公共类结果,其中T:entity
{
公共int状态码{get;set;}
公共整数计数{get;set;}
公共IEnumerable数据{get;set;}
}
和一个示例动作方法

public IActionResult<IEnumerable<User>> GetAll()
{
    var list = _userRepository.GetAll();
    var model = new Result<User>
    {
        StatusCode = 200,
        Count = list.Count,
        Data = list
    };

    return Ok(model);
}
public IActionResult GetAll()
{
var list=_userRepository.GetAll();
var模型=新结果
{
状态代码=200,
Count=list.Count,
数据=列表
};
返回Ok(型号);
}

我猜您要求为api提供一个通用的返回对象,如果是这样,您需要定义一个返回对象,如下所示:

您的返回对象模型,考虑到您的所有实体都有一个基本类型
IEntity
BaseEntity

public class Result<T> where T: IEntity
{
    public int StatusCode { get; set; }
    public int Count { get; set; }
    public IEnumerable<T> Data { get; set; }
}
公共类结果,其中T:entity
{
公共int状态码{get;set;}
公共整数计数{get;set;}
公共IEnumerable数据{get;set;}
}
和一个示例动作方法

public IActionResult<IEnumerable<User>> GetAll()
{
    var list = _userRepository.GetAll();
    var model = new Result<User>
    {
        StatusCode = 200,
        Count = list.Count,
        Data = list
    };

    return Ok(model);
}
public IActionResult GetAll()
{
var list=_userRepository.GetAll();
var模型=新结果
{
状态代码=200,
Count=list.Count,
数据=列表
};
返回Ok(型号);
}
您可以使用匿名对象,如果您不想为每种结果类型定义单独的类,则可以使用匿名对象:

public ActionResult<object> GetAll()
{
    var list = _userRepository.GetAll(); // <-- if this is not (yet) an Array or a List, then force single evaluation by adding .ToArray() or .ToList()
    var model = new
    {
        statuscode = 200,
        count = list.Count, // or .Length if list is an Array
        data = list.Select(x => new { name = x.name, username = x.userName })
    };
    return Ok(model);
}
public ActionResult GetAll()
{
var list=_userRepository.GetAll();//新建{name=x.name,username=x.username})
};
返回Ok(型号);
}
您可以使用匿名对象,如果您不想为每种结果类型定义单独的类,则可以使用匿名对象:

public ActionResult<object> GetAll()
{
    var list = _userRepository.GetAll(); // <-- if this is not (yet) an Array or a List, then force single evaluation by adding .ToArray() or .ToList()
    var model = new
    {
        statuscode = 200,
        count = list.Count, // or .Length if list is an Array
        data = list.Select(x => new { name = x.name, username = x.userName })
    };
    return Ok(model);
}
public ActionResult GetAll()
{
var list=_userRepository.GetAll();//新建{name=x.name,username=x.username})
};
返回Ok(型号);
}


您是指动态调整响应还是始终以后一种形式返回响应?您是如何获得此用户数据的?请您也添加该代码好吗?创建一个强类型模式来表示所需的图形/信封,并返回为什么在HTTP响应中已经包含状态代码的JSON响应中包含状态代码?@KarelTamayo Yes,我需要动态调整响应。你是指动态调整响应还是始终以后一种形式返回响应?你是如何获得此用户数据的?请您也添加该代码好吗?创建一个强类型模式来表示所需的图形/信封,并返回为什么在HTTP响应中已经包含状态代码的JSON响应中包含状态代码?@KarelTamayo Yes,我需要动态调整响应。更改操作返回类型或更新要从
IEnumerable
派生的类是,这就是我要问的。我必须为每个自定义JSON响应定义类吗?这仍然会为每个用户对象输出所有4个字段,而不仅仅是
User
+
username
@ibubi谢谢这也很有用。ibubi,我看到响应的形状是在controller方法中定义的。为什么要在这里定义它?存储库或服务不能对响应进行塑形并返回,以便控制器可以直接交付响应吗?我的印象是控制器应该具有尽可能少的逻辑。更改操作返回类型或更新要从
IEnumerable
派生的类是的,这就是我要问的。我必须为每个自定义JSON响应定义类吗?这仍然会为每个用户对象输出所有4个字段,而不仅仅是
User
+
username
@ibubi谢谢这也很有用。ibubi,我看到响应的形状是在controller方法中定义的。为什么要在这里定义它?存储库或服务不能对响应进行塑形并返回,以便控制器可以直接交付响应吗?我的印象是,控制器应该具有尽可能少的逻辑。这正是我所期待的。非常感谢。Peter,我看到响应的形状是在控制器方法中定义的。为什么要在这里定义它?存储库或服务不能对响应进行塑形并返回,以便控制器可以直接交付响应吗?我的印象是控制器应该具有尽可能少的逻辑。@chiapa请看这里:很好。这正是我所期待的。非常感谢。Peter,我看到响应的形状是在控制器方法中定义的。为什么要在这里定义它?存储库或服务不能对响应进行塑形并返回,以便控制器可以直接交付响应吗?我的印象是控制器应该具有尽可能少的逻辑。@chiapa请看这里: