2015-12-18 8 views
11

To działa dla wszystkich właściwości:Różnica między ReadAsAsync i JsonConvert

string resultAsString = await httpResponseMessage.Content.ReadAsStringAsync(); 
return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<ApiData>(resultAsString)); 

gdy ten działa tylko na niektóre z nich:

return await httpResponseMessage.Content.ReadAsAsync<ApiData>(); 

jaka jest różnica?

+0

Być może używają różnych serializerów? –

Odpowiedz

11

Asynchronicznie odczytywano ze strumienia, a następnie używa wątku puli wątków do deserializacji łańcucha JSON do obiektu.

Ten ostatni odczytuje asynchronicznie ze strumienia, ale przekształca ciąg JSON obiektu synchronicznie na wątku, w którym wznowiony po oczekiwaniu asynchronicznego odczytu ze strumienia.

Wewnętrznie, obie metody wykorzystają Json.NET do analizy danych, ponieważ metoda rozszerzenia HttpContentExtensions.ReadAsAsync<T> będzie wewnętrznie wywoływać JsonMediaTypeFormatter, która używa Json.NET.

Osobiście użyłbym tego ostatniego, ponieważ nie widzę żadnej korzyści w wykonywaniu serializacji w wątku tła. Ale sprawdź kod i sprawdź, czy to działa.

+0

Dziękuję za odpowiedź. Myślałem również, że obie metody są takie same (użyj Json.NET). Zdejmijmy tę asynchroniczną część, wciąż otrzymuję dwa różne wyniki dla: 'string resultAsString = czekaj na httpResponseMessage.Content.ReadAsStringAsync(); ApiData res1 = JsonConvert.DeserializeObject (resultAsString); ' i ' ApiData res2 = czeka na httpResponseMessage.Content.ReadAsAsync (); ' Używam JsonProperties, może to robi tutaj jakąś różnicę? – Senj

+0

'{" upstream_url ":" http: \/\/localhost: 34001 "," ścieżka zapytania ":" \/weather "," id ":" a897b9cb-d4cd-4eca-ce49-42c75e71e27b "," strip_request_path ": true , "name": "WebFrontend", "created_at": 1450446815000} 'to jest mój json. Pierwsza metoda polega na wypełnieniu wszystkiego, w tym drugim tylko identyfikator i imię zostaje wypełnione. – Senj

+0

@Senj Dodaj do struktury strukturę klas i JSON. –