Построение ответа JSON в контроллере Web API

В проекте 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
}

Ответ 1

Итак, вот изменения для вашего поста:

Во-первых, вы должны сделать свой api return Json по умолчанию при передаче запроса text/html (это вы ищете?), Добавив эту строку в ваш класс 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
}

Я настоятельно рекомендую вам не делать ручное форматирование для таких вещей и полагаться на встроенные и сторонние библиотеки. В противном случае вы будете изобретать все, что уже доступно, проверено и готово к работе.

Ответ 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;
}