JSON-Array von Objekten, um Modell in WebAPI mit FromBody
Erstelle ich ein Web-Api-Methode, die annehmen sollte, eine Liste von Objekten über XML-oder JSON und fügen Sie Sie in einer Datenbank.
Hier ist eine sehr einfache version von dem, was ich derzeit habe:
[HttpPost]
public HttpResponseMessage Put([FromBody]ProductAdd productAdd)
{
//do stuff with productadd object
return Request.CreateResponse(HttpStatusCode.OK);
}
Modell die Struktur der Liste der Objekte, die es akzeptiert, ist wie folgt:
public class ProductAdd
{
public List<ProductInformation> Products { get; set; }
}
public class ProductInformation
{
public string ProductName { get; set; }
}
Den oben funktioniert perfekt, wenn ich mit XML (Content-Type: application/xml)
<?xml version="1.0" encoding="utf-8"?>
<ProductAdd>
<Products>
<ProductInformation>
<ProductName>Seahorse Necklace</ProductName>
</ProductInformation>
</Products>
<Products>
<ProductInformation>
<ProductName>Ping Pong Necklace</ProductName>
</ProductInformation>
</Products>
</ProductAdd>
Aber wenn ich versuchen zu füttern die gleiche Sache in der Verwendung von JSON (Content-Type: application/json), die Liste der Produkte ist leer
{
"ProductAdd": {
"Products": [
{
"ProductInformation": { "ProductName": "Seahorse Necklace" }
},
{
"ProductInformation": { "ProductName": "Ping Pong Necklace" }
}
]
}
}
Ist es ein Problem mit dem JSON-serializer, wenn es ein array von Objekten in ein anderes Objekt ?
Irgendwelche Ideen an was dieses Problem beheben ?
Dank
Bearbeiten:
Was serialisierungsprogramme verwenden Sie für XML-und Json?
XML: XmlSerializer
JSON: Newtonsoft
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSON, die Sie senden, um Ihre Web-API-Methode entspricht nicht der Struktur, die Sie zu Deserialisieren in. Im Gegensatz zu XML, das root-Objekt in JSON nicht einen Namen haben. Sie müssen entfernen Sie den wrapper-Objekt aus Ihrer JSON, um es zu arbeiten:
Alternativ könnten Sie ändern Ihre Klasse Struktur HINZUFÜGEN, um eine wrapper-Klasse, aber dann würden Sie auch brauchen, um Ihre XML zu entsprechen, die.
In Situationen, In denen der Deserialisierung wird auf mysteriöse Weise versagt, ich finde es hilfreich zu serialisieren ein test-Objekt, und vergleichen Sie das tatsächliche output mit dem gewünschten Eingang. Wenn die Ausgabe unterscheidet sich von der gewünschten input -, das ist wahrscheinlich die Ursache für den Fehler. In deinem Fall, wenn ich Deserialisieren des XML-und re-serialisieren zu JSON habe ich bekommen:
Wie Sie sehen können, gibt es zwei zusätzliche Ebenen der Dereferenzierung in Ihrer JSON im Vergleich zu den reserialized XML: es gibt ein Wurzel-Objekt-Namen, die nicht vorhanden sein sollten im JSON-Format, und es gibt Sammlung element-Typ-Namen, die auch nicht vorhanden sein sollte. (Diese beiden sind jedoch Allgemeine Funktionen in XML.)
Ist es möglich, ändern Sie Ihre JSON, so dass Sie nicht haben, diese extra-Level, wenn Dereferenzierung? (E. g. war dieses JSON konvertiert aus XML per Skript zu Testzwecken, und somit nicht der tatsächlichen Anforderungen?) Wenn dem so ist, dann ist dein problem ist gelöst.
Wenn nicht, dann sind hier einige Optionen, die für das Deserialisieren es:
Lesen & schreiben Sie ein root-name-Objekt mit dem Sie JSON, finden Sie die Lösungen hier oder hier
Oder, Rollen Sie Ihre eigenen proxy-wrapper:
Injektion die zusätzliche Dereferenzierungsebene in Ihren Listen ist ein bisschen schwieriger. Was Sie tun müssen, ist die Umstrukturierung der JSON-on-the-fly, wie Sie Lesen und schreiben, hinzufügen oder entfernen von zusätzlichen künstlichen Ebene der Verschachtelung. Diese kann getan werden, mit einem
JsonConverter
:Dann verwenden Sie es durch die Anwendung einer
[JsonConverter(typeof(CollectionWithNamedElementsConverter))]
Attribut Sammlungen mit Elementtyp-Namen: