【问题标题】:JSON Response customize .NET Core Web APIJSON 响应自定义 .NET Core Web API
【发布时间】:2018-11-27 12:01:25
【问题描述】:

我正在使用 .net core 2.2 制作 webapi。而且我是 .net 框架的新手 到目前为止,我正在使用基于 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()

json:

[
    {
        "id":1,
        "name": "John Doe",
        "username": "john",
        "password": "AH7B302Iapxf7EFzZVW0/kJDuf/I3pDPkQ42IxBTakA="
    },
    {   
        "id":2,
        "name": "Jane Doe",
        "username": "jane",
        "password": "AH7B302Iapxf7EFzZVW0/kJDuf/I3pDPkQ42IxBTakA="
    }
]

我需要像这样自定义输出。

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

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

【问题讨论】:

  • 您的意思是动态调整响应还是始终以后一种形式返回?
  • 您是如何获得这些用户数据的?能否请您也添加该代码?
  • 创建一个强类型模式来表示所需的图形/信封并返回
  • 为什么在您已经在 HTTP 响应中包含状态代码的 JSON 响应中包含它?
  • @KarelTamayo 是的,我需要动态调整响应。

标签: c# .net json


【解决方案1】:

您可以使用匿名对象,如果您不想为每个结果类型定义一个单独的类,它会派上用场:

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);
}

【讨论】:

  • 不错。这正是我所期待的。非常感谢。
  • 彼得,我看到响应的形状是在控制器方法中定义的。为什么要在这里定义?存储库或服务不能塑造响应并返回它以便控制器可以交付它吗?我的印象是控制器应该有尽可能少的逻辑。
【解决方案2】:

我猜你是在为你的api请求一个通用的返回对象,如果是这样,你需要定义一个返回对象如下,

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

public class Result<T> where T: IEntity
{
    public int StatusCode { get; set; }
    public int Count { get; set; }
    public IEnumerable<T> Data { 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);
}

【讨论】:

  • 更改操作返回类型或更新要从IEnumerable&lt;User&gt;派生的类
  • 是的,这就是我要问的。我必须为每个自定义 JSON 响应定义类吗?
  • 这仍然会为每个用户对象输出所有 4 个字段,而不仅仅是 user + username
  • @ibubi 谢谢,这也很有帮助。
  • ibubi,我看到响应的形状是在控制器方法中定义的。为什么要在这里定义?存储库或服务不能塑造响应并返回它以便控制器可以交付它吗?我的印象是控制器应该有尽可能少的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2020-06-23
相关资源
最近更新 更多