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请看这里: