大多數情況下,默認情況下,我們沒有在我們選擇的靜態語言中定義類,這爲我們解釋瞭如何對其進行反序列化提供了一個尷尬的問題。 JSON從一個調用返回到公開和公開的文本API,專用於單一語言,除了例如HTML和JSON。如何從Web api JSON響應中派生C#動態對象?
在.NET中,這些天來,幾乎所有的API查詢與HttpClient
完成的,像下面的谷歌圖書API ISBN查詢:
public class GoogleBooksClient
{
private const string IsbnUrl = "books/v1/volumes?q=isbn:{0}";
private static HttpClient _client = new HttpClient();
...
public async Task<object> GetDetailsByIsbn(string isbn)
{
var json = await _client.GetStringAsync(string.Format(IsbnUrl, isbn));
dynamic objX = JsonConvert.DeserializeObject(json);
return objX;
}
}
這裏最大的問題是,是否objX
聲明var
」, object
或dynamic
,當DeserializeObject
在沒有已知類型的情況下調用時,它總是引用一個大的,醜陋的JObject
實例。在這種情況下,返回的JSON對象非常複雜,並且有些龍在等待那些試圖編寫可以解析JSON的C#類的人。
這是一個理想的和有意使用C#dynamic
對象的機會,在解析JSON的同時,屬性(以及API響應的很少函數)可遞歸添加到所述動態對象中。
相反,NewtonSoft.JSON將JSON保存的數據與相當不透明的Jobject
數據結構的繁重的繁文lig節連接緊緊地綁定在一起。我很驚訝,也很失望,到目前爲止,牛頓軟件公司不能簡單地提取一個純粹的動態對象,沒有迷宮的所有混亂的官僚作風。
是否有其他方法可以簡單地將JSON解析爲C#動態對象,就像在其他場景中將其解析爲顯式動態JavaScript對象一樣?
新增:通過 「混淆他們JObject的官僚迷宮」,我指的是下面的代碼:
var json = JsonConvert.SerializeObject(new Person {Id = 196912135012878, Age = 47, Name = "Brady"});
var jObj = JsonConvert.DeserializeObject(json);
產生JObject
例如,我的調試器顯示爲:
對我來說,這看起來更像是在解析JSON時應該在內部使用的東西, nd不是該解析的最終產品,它應該只是從該JSON解析的屬性的純粹表示。理想情況下,這是一個C#動態對象,沒有屬性可供任何解析器使用。
http://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm – dman2306
對於'JObject'類型的標記(而不是''JArray''),你可以反序列化爲'ExpandoObject'。請參閱http://www.newtonsoft.com/json/help/html/SerializationGuide.htm#Dynamic。不確定你的問題是什麼。你是什麼意思*迷惑他們JObject迷宮*的官僚作風? – dbc
@dbc增加了我不喜歡'JObject'的原因。感謝「ExpandoObject」提示。這確實會有所幫助。 – ProfK