2016-03-11 15 views
14

In un progetto WebAPI, ho un controller che controlla lo stato di un prodotto, in base a un valore immesso dall'utente.Creazione risposta JSON nel controller API Web

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 costruire 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 
} 
+2

Non si dovrebbe creare JSON da soli, è possibile restituire un oggetto da questo metodo e rendere JSON come formato predefinito per i dati restituiti. –

+0

Puoi fare un esempio basato sul codice sopra? – brother

risposta

25

Così qui sono le modifiche per il tuo post:

In primo luogo, si dovrebbe fare il vostro ritorno API JSON per impostazione predefinita quando si passare una richiesta text/html (è questo che stai cercando?), aggiungendo questa linea alla classe WebApiConfig:

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

In secondo luogo, ho cambiato il codice per restituire un oggetto reale, impersonando la risposta:

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

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

corpo del metodo:

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

Questo sarà risultati nel seguente esempio JSON:

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

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

+0

Sembra quello che sto guardando in anticipo. Solo una domanda: come faccio a iterare con db.Products per aggiungerli, invece del manuale "nuovo ProductApi" nel tuo esempio? Devo avvolgere il nuovo ProductApi in un ForEach di base? – brother

+0

@brother, ho aggiornato la risposta con un semplice codice di esempio usando db, per favore guarda. Considera anche che se hai molti prodotti, questo metodo sarà molto lento, quindi il paging è una buona cosa da considerare dall'inizio. –

+0

Grazie @raderick .. l'ho fatto funzionare come volevo! :) – brother

4

Proprio come raderick accennato, non è necessario per creare la propria infrastruttura JSON personalizzato.

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

E nella vostra azione API, tornare in questo modo:

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

    return result; 
} 
+1

Questo è per MVC, non API –

+0

Sì, grazie per averlo menzionato. –

+0

nessun problema, si prega di prendere in considerazione modificare la tua risposta al fine di rispondere alla domanda OP e quindi ottenere il mio upvote :) –