我可以在j#中将json反序列化为匿名类型吗?

我从DB读了一个很长的json。 我只想要那个json的一个属性。

我有两个选择:a。 为该json创建一个接口并反序列化到该接口。 (因为我只需要一个属性,这是一种矫枉过正吗?)b。 找到我需要的子串(正则表达式?)

哪个是首选?

更新:我正在使用.net 3.5

为什么不使用JSON.NET的“LINQ to JSON”方法( JObject等)反序列化,只是要求名称所需的值?

这是足够动态的,所以你不需要为所有东西创建一个接口,但它比使用正则表达式要脆弱得多。

 JObject json = JObject.Parse(text); JToken value = json["foo"]["bar"]; 

(我相信JSON.NET也支持.NET 4中的dynamic ,但是没有特别需要在这里使用它。)

正则表达式绝对不是任何讨论。 忘记它,就好像它从未存在过一样。

创建和使用强类型是一件好事,可能就像我要去的那样。

但如果你愿意,你也可以使用dynamic

 class Program { static void Main() { var json = "{ 'foo': { 'bar': 'bar value', 'baz': [ 1, 2, 3 ] } }"; var serializer = new JavaScriptSerializer(); dynamic value = serializer.DeserializeObject(json); Console.WriteLine(value["foo"]["baz"][1]); } } 

在控制台上打印2

在.NET 4上:

你可以通过使用这里描述的C#4.0的dynamic特性来做一些像你想要的东西减去正则表达式的需要(你不应该使用正则表达式来做这样的事情!): http : //www.drowningintechnicaldebt.com/ ShawnWeisfeld /存档/ 2010/08 /第22 /使用-C-4.0和动态与解析,json.aspx

唯一的缺点是你不能保证对象的确切结构是什么。

上升的是,不是通过yourDynamicObject['blah']访问成员,而是更多的鸭子类型是你的yourDynamicObject.blah

在.NET 3.5上:

您可以使用Json.NET:http://json.codeplex.com/

查找子字符串是一种危险的优化。

是否值得优化流程(与JSON反序列化相比)并且可以安全地进行此类查找? 我们不能回答是,因为它主要取决于上下文。 但是我想说不,因为它显然在寻找麻烦:即使它现在有效,但是当你的对象的结构或内容发生变化时,它可能在将来被打破。

旧线程,但这里是.NET 3.5上的另一种方法:您可以将DeserializeObject返回的对象强制转换为Dictionary 。 它与使用.NET 4.0动态关键字的解决方案类似:

 JavaScriptSerializer serializer = new JavaScriptSerializer(); Object obj = serializer.DeserializeObject("{ 'name': 'vinicius fonseca', 'age': 31 }"); Dictionary ret = (Dictionary)obj; Console.WriteLine(ret["name"].GetType().Name); // Output: String Console.WriteLine(ret["name"].ToString()); // Output: vinicius fonseca Console.WriteLine(ret["age"].GetType().Name); // Output: Int32 Console.WriteLine(ret["age"].ToString()); // Output: 31 

希望它可以帮到某人。

问候

这取决于。

选项A是更严格,更严格,更正式的方式。 然而,再次像你说的那样可能有点矫枉过正。 那个json有多胖? 从长远来看,选项A留下了未来可能需要使用多个财产的可能性。

选项B绝对是非正式和直接的。 它今天肯定会有用,但将来可能需要不同的解决方案。

因此,您可能希望将整个过程包装在一个方法中,以隐藏调用客户端的实现。 仅使用填充的单个属性返回自定义对象。 然后,如果将来需要,您可以更改方法以使用全倾斜反序列化。

注意:我不认为在C#3.5中对匿名类型进行反序列化是可能的。

你可以做:

 var result = JsonConvert.DeserializeAnonymousType(json, new { Foo="", Bar=""}); 

这将返回包含您定义的字段的动态对象。