2014-05-10 1 views
12

Ich möchte ReadAsAsync() in meinem MVC-Projekt mit. NET 4.0. Das Ergebnis kommt als null.Verwenden von ReadAsAsync <T>() zum Deserialisieren komplexer JSON-Objekt

Wenn ich die uri eingeben bar adressieren, um das Ergebnis in Chrom als (Tag-Name geändert):

<ns2:MyListResponse xmlns:ns2="blablabla"> 
    <customerSessionId>xxcustomerSessionIdxx</customerSessionId> 
    <numberOfRecordsRequested>0</numberOfRecordsRequested> 
    <moreResultsAvailable>false</moreResultsAvailable> 
    <MyList size="1" activePropertyCount="1"> 
    <MySummary order="0"> 
     <id>1234</id> 
     <name>...</name> 
     . 
     . 
    </MySummary> 
    </MyList> 
</ns2:MyListResponse> 

Wenn ich die Anweisung im Code verwenden:

using (var client = new HttpClient()) 
{ 
    var response = client.GetAsync(apiUri).Result; 
    var message = response.Content.ReadAsStringAsync().Result; 

    var result1 = JsonConvert.DeserializeObject<MyListResponse>(message); 
    var result2 = response.Content.ReadAsAsync<MyListResponse>().Result; 
} 

die Nachricht kommt in String-Format als "{\"MyListResponse\":{\"customerSessionId\"...}", die als zu einem json Objekt entsprechen:

{"MyListResponse": 
    {"customerSessionId":"xxcustomerSessionIdxx", 
    "numberOfRecordsRequested":0, 
    "moreResultsAvailable":false, 
    "MyList": 
     {"@size":"1", 
     "@activePropertyCount":"1", 
     "MySummary": 
      {"@order":"0", 
      "id":1234, 
      "name":"...", 
      . 
      . 
      } 
     } 
    } 
} 

und die Eigenschaften von result1 und result2 wurden als Null- oder Standardwerte angegeben. Klassendefinitionen finden Sie weiter unten. Ich möchte den Inhalt als Objekt lesen, konnte es aber nicht. Was raten Sie dazu, das zu lösen? Was mache ich falsch? Danke im Voraus.

public class MySummary 
{ 
    public int @Order { get; set; } 
    public string Id { get; set; } 
    public string Name { get; set; } 
    . 
    . 
} 

public class MyList 
{ 
    public int @Size { get; set; } 
    public int @ActivePropertyCount { get; set; } 
    public MySummary MySummary{ get; set; } 
} 

public class MyListResponse 
{ 
    public string CustomerSessionId { get; set; } 
    public int NumberOfRecordsRequested { get; set; } 
    public bool MoreResultsAvailable { get; set; } 
    public MyList MyList { get; set; } 
} 

Antwort

7

ich eine neue Klasse definiert als:

public class ResponseWrapper 
{ 
    public MyListResponse MyListResponse { get; set; } 
} 

dann habe ich diese Umhüllung mit,

var result1 = JsonConvert.DeserializeObject<ResponseWrapper>(message); 
var result2 = response.Content.ReadAsAsync<ResponseWrapper>().Result; 

dann hat es funktioniert. Ich brauche nur MySummary-Objekt, aber ich sollte mehr Klassen schreiben, damit es funktioniert.

6

Nach der Lösung Lesen kam ich mit ein, die nicht eine zusätzliche Klasse braucht:

private static async Task<U> Execute<U>(HttpClient client, string path) 
    { 
     U output = default(U); 

     HttpResponseMessage response = await client.GetAsync(path); 

     if (response.IsSuccessStatusCode) 
     { 
      var jsonAsString = await response.Content.ReadAsStringAsync(); 
      output = JsonConvert.DeserializeObject<U>(jsonAsString); 
     } 
     else 
     { 
      throw new ApplicationException(string.Format("Response message is not OK. Issues in action: {0}", path)); 
     } 

     return output; 
    } 
+1

Sie können dies noch weiter vereinfachen 'output = await response.Content.ReadAsAsync (); ' – Nkosi

3

Aus Gründen der zukünftigen Leser, ich glaube, der richtige Ansatz ReadAsAsync Überlastung verwendet, die IEnumerable<MediaTypeFormatter> nimmt und bieten ein Formatierer mit den gleichen Einstellungen, die auf dem Server für die Serialisierung verwendet werden. Das sollte es beheben.

0

Es ist möglich, beim Client ReadAsAsync mit MyListResponse direkt (in der Folge ohne ResponseWrapper) zu verwenden. Zu diesem Zweck können Sie "BodyStyle = WebMessageBodyStyle.Bare" im Operationsvertrag von "apiuri" statt "BodyStyle = WebMessageBodyStyle.Wrapped" (serverseitig, d. H. Dienstvertrag) definieren.

Verwandte Themen