Abrufen anonymer Typ aus dem Internet in C#
Ich versuche zum abrufen von Daten aus dem web. Die Daten dienten entweder als JSON-Objekt-oder XML -: in beiden Fällen möchte ich nicht, ein Modell zu bauen auf der Grundlage der Struktur dieser XML - /JSON-aber nur die Daten abrufen, die ich brauche.
HttpResponseMessage response = await client.PostAsync(
"http://www.someAPI.com/api.xml",
requestContent);
response.EnsureSuccessStatusCode();
HttpContent content = response.Content;
Wenn ich ein Modell zu bauen, basierend auf der Daten-Struktur, die ich erhalten werde zurück ich werde es tun: ich möchte nur wissen, ob es irgendeine alternative. Kann ich analysieren content
als eine anonyme Art und, sagen wir, das abrufen der Daten, die als beliebige Felder oder Eigenschaften oder array-Indizes?
Sagen wir mal: response.Countries[5].CountryId
. Ist es möglich, in diesen 2 Typen (JSON und XML)? Wie kann ich es tun?
- Sollten Sie formulieren Ihre Fragen: wie es jetzt ist, sind die Antworten ja und ja. Aber ich denke, das hilft Ihnen nicht viel.
- Sie könnten versuchen, Zuordnung der Inhalte, die Sie wieder zu einer dynamic - - variable und den Zugriff auf die Eigenschaften/Werte aus - aber dann müssten Sie wissen vorher, was die Namen der Eigenschaften sind
- natürlich, ich weiß schon, die Daten-Struktur. Ich will einfach nicht, ein Modell zu bauen über die es.
- Haben Sie sah über die
XPath
Selektoren in .NET? Diese werden zusammen mitLINQ
und dieXDocument
- Klasse bieten eine wirklich einfache und leistungsstarke Möglichkeit zum Zugriff auf XML-Daten. - Ein Modell wie in, mit, um erstellen Sie eine POCO, nur um in der Lage sein, um den Inhalt zugreifen? Dann
dynamic
könnte eine ordentliche Weg, um zu bekommen, dass. - Ich Stimme mit Sameer Singh, ich würde denken, die dynamische variable wäre der beste Weg zu gehen? (d.h. setzen die
response.Content
in einem dynamischen var würde den trick tun, dann könnten Sie rufen Sie die bekannte Eigenschaft direkt.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT #2:
Habe ich eine Anmerkung unten über die Verwendung der ausgezeichneten Json.NET Bibliothek zu Deserialisieren zu einem
dynamic
Objekt.EDIT #1:
Dank Hoghweed Antwort, unten meine Antwort ist nun mehr abgeschlossen. Wir müssen insbesondere cast die
HttpContent
bekommen wir vonHttpResponseMessage.Content
zuExpandoObject
, um für diedynamic
-ness arbeiten als erwartet:Um die
ReadAsync - <T>()
Erweiterung Methode obwohl, Sie müssten verwenden Sie NuGet zu herunterladen und installierenSystem.Net.Http.Formatting.dll
von derMicrosoft.AspNet.WebApi.Client
- Paket (hier ist die "alte" Nuget-Seite, die erwähnt, dass es nun in den oben genannten Paket).Original Antwort:
So, Sie wollen nicht zu haben, um eine POCO und verwalten Sie Ihre Eigenschaften als XML - /JSON-Struktur, die Sie wieder ändert.
dynamic
scheint perfekt für Ihren Anwendungsfall:Insbesondere in Bezug auf XML: Sie könnten versuchen,Anoop Madhusudanan ist
ElasticObject
, die sehr hilfreich sein könnten bei der Konvertierung zwischendynamic
undXML
und zurück.Insbesondere in Bezug auf JSON:, die Sie nutzen könnten Json.NET etwas wie das hier tun:
Die up-Seite ist, dass man nicht eine Abhängigkeit der
Microsoft.AspNet.WebApi.Client
Paket (die, wie derv4.0.30506.0
, hängt davon ab, Json.NET). Der Nachteil ist, dass Sie nicht in der Lage dies für XML.Hoffe, das hilft.
ExpandoObject
zu sein scheint .NET 4.0 ist die offizielle Antwort auf Dinge wie dieElasticObject
.ElasticObject
wird aktiv entwickelt, in der Erwägung, dassExpandoObject
updates sind gebunden an neue Versionen der .NET framework (obwohl, ist, dass Aussehen ändern). Es hängt auch davon ab, ob die OP wäre es erlaubt, software von Drittanbietern verwenden oder nicht.ElasticObject
vor, aber... es sieht toll aus; ich könnte es versuchen.HttpContent content = response.Content;
zudynamic content = response.Content;
?Lesen der
HttpResponseMessage.Content
als dynamische es ist möglich, aber nicht Zugriff auf es direkt als dynamisch, aber mit der richtigen extension-Methode zum Lesen von Inhalt es ist, ExpandoObject.Schrieb ich das Verhalten testen, dass es klar ist ein test, aber der Zusammenhang ist ähnlich zu dem, was Ihre Frage ist:
Den test ist wie folgt strukturiert:
HttpResponseMessage
mit einem Inhalt von diesem Objekt mit einem JsonMedia FormatterExpandoObject
Den test Voraussetzung ist die Installation des Microsoft.AspNet.WebApi.Client
So, dies ist der code der test -
Dies könnte getan werden, sicher für xml zu.
.ReadAsAsync<ExpandoObject>().Result
zum abrufen derHttpContent
alsdynamic
?