Compilare la risposta JSON nel controller API Web

In un progetto WebAPI, ho un controller che controlla lo stato di un prodotto, in base a un valore inserito dall’utente.

Diciamo che inseriscono “123” e la risposta dovrebbe essere “stato”: 1, E un elenco di prodotti. Se inseriscono “321” lo “stato” è 0, E un elenco di prodotti.

La mia domanda è, come faccio a build una tale stringa corretta in un controller 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; } } 

Inoltre, questa uscita / risposta è considerata valida?

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

Quindi, ecco le modifiche per il tuo post:

Innanzitutto, dovresti rendere il tuo API restituito JSON di default quando passi una richiesta text/html (è questo che stai cercando?), Aggiungendo questa linea alla tua class WebApiConfig :

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

Secondo, ho cambiato il codice per restituire un object reale, impersonando la tua risposta:

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

Metodo del corpo:

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

Ciò comporterà l’esempio seguente json:

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

Ti consiglio vivamente di non eseguire la formattazione manuale per tali cose e di basarti su librerie incorporate e di terze parti. Altrimenti, reinventerai le cose già disponibili, testate e pronte per il lavoro.

Proprio come Raderick ha menzionato, non è necessario creare la propria infrastruttura JSON personalizzata.

 public class ProductApi { public int Id {get;set;} public string Name { get; set; } } public class ResponseDTO { public int Status {get;set;} public List { get; set; } } 

E nella tua azione API, restituisci in questo modo:

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