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

我可以在c#中将json反序列化为匿名类型吗?,c#,regex,json,.net-3.5,C#,Regex,Json,.net 3.5,我从数据库中读取了一个长json。 我只需要json的一个属性 我有两个选择: A.为该json创建一个接口并反序列化到该接口。 (因为我只需要一个属性,这是不是太过分了?) B找到我需要的子字符串(regex?) 哪一个比较好 更新:我正在使用.net 3.5为什么不使用的“LINQ到JSON”方法(JObject等)反序列化,然后按名称请求所需的值 这是足够动态的,所以您不需要为所有内容创建接口,但它比使用正则表达式要简单得多 JObject json = JObject.Parse(tex

我从数据库中读取了一个长json。 我只需要json的一个属性

我有两个选择: A.为该json创建一个接口并反序列化到该接口。 (因为我只需要一个属性,这是不是太过分了?) B找到我需要的子字符串(regex?)

哪一个比较好


更新:我正在使用.net 3.5

为什么不使用的“LINQ到JSON”方法(
JObject
等)反序列化,然后按名称请求所需的值

这是足够动态的,所以您不需要为所有内容创建接口,但它比使用正则表达式要简单得多

JObject json = JObject.Parse(text);
JToken value = json["foo"]["bar"];
(我相信JSON.NET也支持.NET 4中的
动态
,但这里没有特别需要使用它。)

在.NET 4上:

通过使用C#4.0的
dynamic
功能,您可以做一些类似于您想要的事情,而不需要正则表达式(并且您不应该将正则表达式用于类似的事情!),如下所述:

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

这样做的好处是,不是通过
yourDynamicObject['blah']
访问成员,而是通过
yourDynamicObject.blah

在.NET 3.5上:


您可以使用Json.NET:

Regex必须绝对不在讨论范围之内。忘了它吧,就好像它从未存在过一样

创建和使用强类型是一件好事,而且可能是我的方式

但如果需要,也可以使用
动态

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

视情况而定

选择A是更严格、更有纪律、更正式的方式。然而,正如你所说,这可能是过火了。那有多胖?从长远来看,方案A可能会让您未来可能需要使用多处房产

方案B显然更为非正式和直接。它在今天肯定会起作用,但将来可能需要不同的解决方案

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


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

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


与JSON反序列化相比,优化这个过程是否值得?这样的查找是否安全?我们不能回答“是”,因为这主要取决于上下文。但是我想说,因为它显然是在找麻烦:即使它现在可以工作,将来当对象的结构或内容发生变化时,它可能会被破坏。

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

JavaScriptSerializer serializer = new JavaScriptSerializer();
Object obj = serializer.DeserializeObject("{ 'name': 'vinicius fonseca', 'age': 31 }");
Dictionary<String, Object> ret = (Dictionary<String, Object>)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
JavaScriptSerializer serializer=新的JavaScriptSerializer();
Object obj=serializer.DeserializeObject(“{'name':'vinicius fonseca','age':31}”);
字典ret=(字典)obj;
Console.WriteLine(ret[“name”].GetType().name);//输出:字符串
Console.WriteLine(ret[“name”].ToString());//产出:丰塞卡葡萄酒
Console.WriteLine(ret[“age”].GetType().Name);//输出:Int32
Console.WriteLine(ret[“age”].ToString());//产出:31
希望它能帮助别人

关于

您可以做:

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

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

我使用的是c#3.5,我认为没有动态类型。对吗?@Elad Benda,不,没有。那么您可以使用提供类似语法的方法。请您详细说明您的答案,再添加一点关于您提供的解决方案的说明,好吗?