Anonymen Typ aus dem Web in C # abrufen

8

Ich versuche, einige Daten aus dem Internet abzurufen. Die Daten werden entweder als JSON-Objekt oder als XML geliefert: In beiden Fällen möchte ich basierend auf der Struktur dieses XML / JSON kein Modell erstellen, sondern nur die Daten abrufen, die ich brauche.

%Vor%

Wenn ich ein Modell basierend auf der Datenstruktur erstellen muss, die ich zurückbekomme, mache ich es: Ich möchte nur wissen, ob es eine Alternative gibt. Kann ich content als anonymen Typ analysieren und, sagen wir, die Daten als beliebige Felder oder Eigenschaften oder Array-Indizes abrufen?

Sagen wir: response.Countries[5].CountryId . Ist es möglich in einem dieser 2 Typen (JSON und XML)? Wie kann ich es tun?

    
Saturnix 01.08.2013, 08:08
quelle

2 Antworten

17

BEARBEITEN # 2:

Ich habe unten eine Anmerkung zur Verwendung der exzellenten Json.NET -Bibliothek hinzugefügt, um sie zu deserialisieren dynamic Objekt.

EDIT # 1:

Dank Hoghweeds Antwort ist meine Antwort unten vollständiger. Insbesondere müssen wir das HttpContent , das wir von HttpResponseMessage.Content erhalten, auf ExpandoObject , damit die dynamic -ness wie erwartet funktioniert:

%Vor%

Um die Erweiterungsmethode ReadAsync<T>() zu erhalten, müssten Sie NuGet , um System.Net.Http.Formatting.dll von der Microsoft.AspNet.WebApi.Client Paket ( hier ist die" alte "Nuget-Seite , die erwähnt, dass es jetzt in dem obigen Paket enthalten ist.

Ursprüngliche Antwort:

Sie wollen also kein POCO erstellen und müssen seine Eigenschaften als XML / JSON-Struktur erhalten Sie Änderungen zurück. dynamic scheint perfekt für Ihren Anwendungsfall zu sein:

%Vor%

Speziell in Bezug auf XML: können Sie Anoop ausprobieren Madhusudanans ElasticObject , die bei der Konvertierung zwischen dynamic und XML und zurück sehr hilfreich sein könnten.

Speziell in Bezug auf JSON: können Sie Json.NET etwas tun so:

%Vor%

Der Vorteil ist, dass Sie keine Abhängigkeit von Microsoft.AspNet.WebApi.Client Paket (welches ab v4.0.30506.0 von Json.NET abhängt). Der Nachteil ist, dass Sie dies nicht für XML verwenden können.

Hoffe, das hilft.

    
Sameer Singh 01.08.2013, 09:16
quelle
2

Wenn Sie HttpResponseMessage.Content als dynamic lesen, ist es zwar möglich, aber nicht auf direkt als dynamic zuzugreifen, sondern die richtige Erweiterungsmethode zu verwenden, um den Inhalt als ExpandoObject zu lesen

Ich habe dafür einen Verhaltenstest geschrieben, es ist klar, dass es sich um einen Test handelt, aber der Kontext ähnelt dem, was deine Frage ist:

  1. ein Antwortobjekt mit einem JSON-Inhalt (ich habe json in meinem Test verwendet)
  2. eine dynamische Auflösung ohne Modellobjekt

Der Test ist wie folgt aufgebaut:

  1. Gegeben ein anonymer Gegenstand
  2. Beim Erstellen eines HttpResponseMessage mit einem Inhalt dieses Objekts mit einem JsonMedia Formatter
  3. Dann ist es möglich, mit einem ExpandoObject als dynamisch darauf zuzugreifen

Die Testvoraussetzung ist die Installation von Microsoft.AspNet.WebApi.Client Also, das ist der Code des Tests

%Vor%

Dies könnte auch für xml sicher gemacht werden.

    
Hoghweed 01.08.2013 13:33
quelle

Tags und Links