我可以在c#中将json反序列化为匿名类型吗?
我从数据库中读取了一个长json。 我只需要json的一个属性 我有两个选择: A.为该json创建一个接口并反序列化到该接口。 (因为我只需要一个属性,这是不是太过分了?) B找到我需要的子字符串(regex?) 哪一个比较好我可以在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
更新:我正在使用.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,不,没有。那么您可以使用提供类似语法的方法。请您详细说明您的答案,再添加一点关于您提供的解决方案的说明,好吗?