2016-03-11 31 views
14

Bir WebAPI projesinde, kullanıcının girdiği değere bağlı olarak bir ürünün durumunu denetleyen bir denetleyiciye sahibim.Web API denetleyicisinde JSON yanıtı oluşturma

"123" girdiğine ve yanıtın "durum": 1 ve ürün listesinin bir listesi olması gerektiğini söyler. "321" girerse "durum" 0, VE ürün listesidir.

Sorum şu ki, bir WebAPI denetleyicisinde nasıl böyle bir dize doğru yapıyorum.

[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; } 
} 

Ayrıca, bu çıktı/yanıt geçerli sayılır mı?

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

{ 
    "status": 0 
} 
+2

Kendi başına json oluşturmamalısınız, bu yöntemden bir nesne döndürebilir ve JSON'u döndürülen veriler için varsayılan biçim olarak yapabilirsiniz. –

+0

Yukarıdaki koda dayalı bir örnek verebilir misiniz? – brother

cevap

25

sizin yazı için değişiklikler şunlardır::

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

Ve API eylem

böyle döndüğünüzde

İlk olarak, varsayılan olarak api dönüşü Json yapmalıdır senin WebApiConfig sınıfına bu satır ekleyerek, bir text/html isteği (? Eğer bu Aradığınız edilir) pass:

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

İkincisi, senin yanıtını taklit, gerçek bir nesneyi döndürmek için kod değiştirildi:

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

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

Yöntem gövdesi:

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

Bu işlem Aşağıdaki örnek json sonuçları:

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

Bu tür şeyler için el ile biçimlendirme yapmamanızı ve yerleşik ve üçüncü taraf kitaplıklarına güvenmenizi kesinlikle öneririm. Aksi takdirde, halihazırda mevcut olan, test edilmiş ve çalışmaya hazır olan şeyleri yeniden keşfedeceksiniz.

+0

Öncesine baktığım gibi görünüyor. Ancak sadece bir soru: Örneğinizde manuel olarak "yeni ProductApi" yerine, onları eklemek için db.Products ile nasıl yineliyorum? Yeni ProductApi'yi temel olarak ForEach'a sarmam gerekecek mi? – brother

+0

@brother, db'yi kullanarak basit örnek kod ile cevabı güncelledim, lütfen bir göz atın. Ayrıca, çok fazla ürününüz varsa, bu yöntemin çok yavaş olacağını düşünün. Bu nedenle, sayfalama, başlangıçtan itibaren dikkate alınması gereken iyi bir şeydir. –

+0

Teşekkürler @raderick .. Ben istediğim gibi çalışıyorum! :) – brother

4

raderick sözü gibi, kendi özel JSON altyapısını oluşturmak gerekmez. Yani burada

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

    return result; 
} 
+1

Bu, MVC için değil, API –

+0

Yup için değil, bunu söylediğin için teşekkürler. –

+0

sorun değil, lütfen göz önünde bulundurun, OP sorusuna cevap vermek için cevabınızı düzenleyin ve sonra benim son notumu alın :) –