2011-11-03 88 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