C# 在Web API控制器中构建JSON响应

C# 在Web API控制器中构建JSON响应,c#,json,asp.net-web-api,asp.net-web-api2,C#,Json,Asp.net Web Api,Asp.net Web Api2,在WebAPI项目中,我有一个控制器,它根据用户输入的值检查产品的状态 假设他们输入“123”,响应应该是“状态”:1和产品列表。如果输入“321”,则“状态”为0,并显示产品列表 我的问题是,如何在WebAPI控制器中构建这样一个正确的字符串 [Route("{value:int}")] public string GetProducts(int value) { var json = ""; var products = db.Products; if (produc

在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
}

正如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; }
}

以下是您的帖子的改动:

首先,当您传递一个
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
}

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

您不应该自己创建json,您可以从这个方法返回一个对象,并将JSON作为返回数据的默认格式。您可以根据上面的代码制作一个示例吗?JObect也是一个很好的工具:的可能重复似乎是我正在寻找的。不过,只有一个问题:如何迭代db.Products来添加它们,而不是在您的示例中手动添加“newproductapi”?我需要将新的ProductApi封装在ForEach basicly中?@brother,我使用db用简单的示例代码更新了答案,请看一看。另外,如果你有很多产品,这个方法将会非常慢,所以从一开始就考虑寻呼是一件好事。谢谢@ RADERICK。我让它按照我的要求正常工作了!:)请记住,在任何情况下,您都可以使用匿名类型,在这种情况下,您可以选择以JSON形式返回数据。这是针对MVC的,没有问题,请考虑编辑您的答案以回答OP问题,然后获得我的投票:)
{
  "Products": [
    {
      "Name": "Pork"
    },
    {
      "Name": "Beef"
    },
    {
      "Name": "Chicken"
    },
    {
      "Name": "Salad"
    }
  ],
  "Status": 1
}