2016-03-11 14 views
14

In einem WebAPI-Projekt habe ich einen Controller, der den Status eines Produkts basierend auf einem vom Benutzer eingegebenen Wert überprüft.JSON-Antwort im Web-API-Controller erstellen

Nehmen wir an, sie geben "123" und die Antwort sollte "Status" sein: 1, und eine Liste von Produkten. Wenn sie "321" eingeben, lautet der "Status" 0 und eine Liste von Produkten.

Meine Frage ist, wie ich eine solche Zeichenfolge in einem WebAPI-Controller korrekt erstellen.

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

Wird diese Ausgabe/Antwort auch als gültig betrachtet?

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

{ 
    "status": 0 
} 
+2

Sie sollten json nicht selbst erstellen. Sie können ein Objekt von dieser Methode zurückgeben und JSON als Standardformat für zurückgegebene Daten festlegen. –

+0

Können Sie anhand des obigen Codes ein Beispiel erstellen? – brother

Antwort

25

Also hier sind die Änderungen für Ihren Beitrag:

Zunächst sollten Sie Ihre api Rückkehr Json standardmäßig, wenn Sie passieren eine text/html Anfrage (wird dieser Sie suchen?), das Hinzufügen dieser Zeile in WebApiConfig Klasse:

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

Zweitens änderte ich den Code ein reales Objekt zurückzukehren, Ihre Antwort Identitätswechsel:

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

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

Methode Körper:

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

Dies wird Ergebnisse im folgenden Beispiel json:

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

Ich rate Ihnen dringend, keine manuelle Formatierung für solche Dinge zu machen, und verlassen Sie sich auf integrierte und 3rd-Party-Bibliotheken. Ansonsten erfindest du die Dinge neu, die bereits verfügbar sind, getestet und bereit zu arbeiten.

+0

Scheint, wie ich suche nach vorne. Aber nur eine Frage: Wie iterate ich durch db.Products, um sie hinzuzufügen, anstelle des Handbuchs "new ProductApi" in Ihrem Beispiel? Ich muss das neue ProductApi in einem ForEach grundlegend verpacken? – brother

+0

@Brüder, ich aktualisierte die Antwort mit einfachen Beispielcode mit db, bitte schauen Sie. Bedenken Sie auch, dass diese Methode sehr langsam ist, wenn Sie viele Produkte haben. Daher ist Paging von Anfang an eine gute Sache. –

+0

Dank @raderick .. ich habe es excatly funktioniert, wie ich wollte! :) – brother

4

Wie raderick erwähnt, brauchen Sie nicht Ihre eigene benutzerdefinierte JSON-Infrastruktur zu erstellen.

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

Und in Ihrer API-Aktion, wie dies zurück:

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

    return result; 
} 
+1

Dies ist für MVC, nicht API –

+0

Yup, danke für die Erwähnung. –

+0

kein Problem, bitte berücksichtigen Sie Ihre Antwort bearbeiten, um die OP-Frage zu beantworten und dann meine upvote :) –

Verwandte Themen