【问题标题】:Build JSON response in Web API controller在 Web API 控制器中构建 JSON 响应
【发布时间】:2016-06-26 12:21:50
【问题描述】:

在一个 WebAPI 项目中,我有一个控制器,它根据用户输入的值检查产品的状态。

假设他们输入“123”,响应应该是“状态”:1,以及产品列表。如果他们输入“321”,则“状态”为 0,并且是产品列表。

我的问题是,如何在 WebAPI 控制器中正确构建这样的字符串。

[Route("{value:int}")]
public string GetProducts(int value)
{
    var json = "";
    var products = db.Products;
    if (products.Any())
    {
        foreach (var s in products)
        {
            ProductApi product = new ProductApi();
            product.Name = s.Name;
            json += JsonConvert.SerializeObject(supplier);
        }
    }

    var status = db.Status;
    if (status.Any())
    {
        json += "{status:1}";
    }
    else
    {
        json += "{status:0}";
    }

    return json;
}

public class ProductApi
{
    public string Name { get; set; }
}

另外,这个输出/响应是否被认为是有效的?

[
    {
        "id":1,
        "name":"product name"
    },
    {
        "id":2,
        "name":"product name 2"
    },
    {
        "id":3,
        "name":"product name 3"
    }
]

{
    "status": 0
}

【问题讨论】:

标签: c# json asp.net-web-api asp.net-web-api2


【解决方案1】:

以下是您帖子的更改:

首先,当您传递text/html 请求时,您应该让您的api 默认返回Json(这是您要找的吗?),将此行添加到您的WebApiConfig 类中:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

其次,我修改了代码,返回一个真实的对象,模拟你的响应:

public class ProductApiCollection
{   
    public ProductApi[] Products { get; set; }      
    public byte Status { get; set; }
}

public class ProductApi
{
    public string Name { get; set; }
}

方法体:

public ProductApiCollection Get()
{
    var result = new ProductApiCollection();
    var dbProducts = db.Products;
    var apiModels = dbProducts.Select(x => new ProductApi { Name = x.Name } ).ToArray();
    result.Products = apiModels;

    var status = db.Status.Any() ? 1 : 0;
    result.Status = status;

    return result;
}

这将产生以下示例 json:

{
  "Products": [
    {
      "Name": "Pork"
    },
    {
      "Name": "Beef"
    },
    {
      "Name": "Chicken"
    },
    {
      "Name": "Salad"
    }
  ],
  "Status": 1
}

我强烈建议您不要对此类内容进行手动格式化,而应依赖内置库和 3rd 方库。否则,您将重新发明已经可用、经过测试并准备好工作的东西。

【讨论】:

  • 看起来像我正在寻找的东西。不过只有一个问题:我如何遍历 db.Products 来添加它们,而不是您示例中的手动“new ProductApi”?我基本上需要将新的 ProductApi 包装在 ForEach 中?
  • @brother,我使用 db 用简单的示例代码更新了答案,请看一下。还要考虑如果你有很多产品,这种方法会很慢,所以从一开始就考虑分页是个好东西。
  • 谢谢@raderick .. 我让它按我的意愿工作! :)
  • 请记住,在选择要以 JSON 格式返回的数据的任何场景中,您都可以利用匿名类型
【解决方案2】:

正如 raderick 所述,您无需创建自己的自定义 JSON 基础架构。

public class ProductApi
{
    public int Id {get;set;}
    public string Name { get; set; }
}

public class ResponseDTO
{
    public int Status {get;set;}
    public List<ProductApi> { get; set; }
}

在您的 API 操作中,返回如下:

[Route("{value:int}")]
public ResponseDTO GetProducts(int value)
{
    ResponseDTO result = ...// construct response here 

    return result;
}

【讨论】:

  • 这是用于 MVC,而不是 API
  • 没问题,请考虑编辑您的答案以回答 OP 问题,然后获得我的支持 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2017-06-23
相关资源
最近更新 更多