web-dev-qa-db-ja.com

Web APIコントローラーでJSON応答を作成する

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
}
17
brother

投稿の変更点は次のとおりです。

最初に、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
}

このようなことを手動でフォーマットせず、組み込みおよびサードパーティのライブラリに依存することを強くお勧めします。それ以外の場合は、既に利用可能でテスト済みで動作可能な状態のものを再発明します。

35
Red

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;
}
4
Tamas Ionut