2016-03-11 10 views
14

WebAPIプロジェクトでは、ユーザが入力した値に基づいて製品のステータスをチェックするコントローラがあります。Web APIコントローラでのJSON応答の作成

「123」を入力し、応答は「status」:1、製品のリストである必要があります。 「321」と入力すると、「ステータス」は0になり、商品のリストが表示されます。

私の質問は、WebAPIコントローラでこのような文字列を正しく構築する方法です。

また、この出力/応答は有効と見なされますか?

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

{ 
    "status": 0 
} 
+2

独自にjsonを作成しないでください。このメソッドからオブジェクトを返し、返されたデータのデフォルトの形式としてJSONを作成できます。 –

+0

上記のコードに基づいて例を挙げることができますか? – brother

答えて

25

はあなたのポストのために変更されている:

まずとき、あなたは、デフォルトでは、あなたのAPIリターン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 
} 

このようなことは手動でフォーマットしないよう強くお勧めします。また、組み込みのライブラリや第三者のライブラリに依存することを強くお勧めします。それ以外の場合は、すでに利用可能で、テスト済みで、作業準備ができているものを再開発することになります。

+0

私は何を見ているかのように見えます。しかし、1つの質問:db.Productsを反復して、サンプルの "new ProductApi"マニュアルではなく、どのように追加するのですか? ForEachで新しいProductApiを基本的にラップする必要がありますか? – brother

+0

@brother、私はdbを使って簡単なサンプルコードで答えを更新しました。また、多くの製品がある場合、この方法は非常に遅いので、ページングは​​最初から検討するのが良いことだと考えてください。 –

+0

ありがとう@raderick ..私はそれが私が欲しがったようにexcatly仕事を得た! :) – brother

4

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; 
} 
+1

これはMVCのためのもので、API –

+0

ではありません。 –

+0

問題はありません。質問を回答し、私のupvoteを取得するためにあなたの答えを編集してください:) –