2011-11-03 126 views
13

只是試圖從JSON創建一個匿名類型,而無需提前瞭解參數,並完全解釋它們(可能帶有提示)。即該值「看起來」像一個int,字符串或日期。如何使用JSON.Net反序列化爲匿名類型?

到目前爲止,我知道的唯一方法是創建一個您已經預先知道的匿名類型。請參閱下面的.DeserializeAnonymousType(...)方法。

任何人都可以做得比這更好嗎?謝謝。

 var jsonString = "{\"user_id\": 1, \"user_type\": \"moderator\", \"name\": \"Fred\"}"; 

     JToken root = JObject.Parse(jsonString); 

     var anonTemplate = new{user_id=0, user_type="", name="" }; 

     var a = JsonConvert.DeserializeAnonymousType(root.ToString(), anonTemplate); 


     var b = JsonConvert.DeserializeObject<Object>(root.ToString()); // actually turns into a JsonObject which is something differet. 

更新

我下載dynamicduck和我與它一點點打。請問這種奇怪的動態「包裝」的布賴恩的想法可以按我需要的方式(可序列化等)?

http://weblogs.asp.net/britchie/archive/2010/08/05/json-net-dynamic-extensions.aspx

http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx

+0

在.NET 4的情況下,我假設你應該能夠反序列化爲'動態'對象,然後明確地訪問所需的屬性 – sll

+2

如果你不知道它具有或預期的參數是什麼,你打算如何使用這個對象有? – KallDrexx

+0

@sll:有個例子嗎?不針對動態類型。我偶爾使用它們。在這種情況下,我的下一個問題是如何將動態轉換爲匿名類型。我對任何一條路都很滿意,因爲性能不是問題,但是,在這種情況下,我需要一個匿名類型(現有的庫)。 – sgtz

回答

6

您可以JSON.NET使用ExpandoObjectConverter反序列化到ExpandoObject

在運行時創建一個匿名類型,其相當多的複雜的,看看箍在這個線程躍升至:

How to create LINQ Expression Tree to select an anonymous type

正如你可以看到相當多的努力,可能是不值得的,因爲你仍然不會得到任何編譯時的安全。所以dynamic或ExpandoObject是你最好的選擇。

+1

你有一個可以鏈接到ExpandoObjectConverter使用的例子嗎? – sgtz