C# – 将JSON反序列化为匿名对象

在C#中,我已经使用这样的代码成功地将匿名对象序列化为JSON …

var obj = new { Amount = 108, Message = "Hello" }; JavaScriptSerializer serializer = new JavaScriptSerializer(); String output = serializer.Serialize(obj); 

但是,我希望以后能够将JSON字符串反序列化为匿名对象。 这样的东西……

 var obj2 = serializer.Deserialize(output, object); 

但是serializer.Deserialize()方法需要第二个参数,它是要反序列化的对象类型。

我试过这个……

 var obj2 = serializer.Deserialize(output, obj.GetType()); 

但这会产生错误:

没有为’ f__AnonymousType0`2 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture]的类型定义无参数构造函数=中立,PublicKeyToken = b77a5c561934e089]]’。

我不确定这个错误意味着什么。

JSON.Net是一个function强大的库,可以在.Net中使用JSON

您可以使用方法DeserializeAnonymousType 。

更新 :Json.Net现在包含在ASP.Net中,但我最近使用的最喜欢的是JsonFX 。 它也有很棒的linq支持,请查看。

更新2 :我已经从JsonFX转移,目前使用ServiceStack.Text ,速度很快!

动态如何,我看到的最快的方式是:

 dynamic myObject = JsonConvert.DeserializeObject(output); decimal Amount = Convert.ToDecimal(myObject.Amount); string Message = myObject.Message; 

注意:您将需要Newtonsoft.json.dll引用

如何使用DeserializeObject方法 ,它不需要特定的类型。 这也解决了类似的SO问题 。 该方法反序列化为包含名称/值对的Dictionary

更新 :澄清执行此操作时出现的错误:

 var obj2 = serializer.Deserialize(output, obj.GetType()); 

给定obj的类型, Deserialize将尝试使用默认构造函数创建该类型的新实例。 C#中的匿名类型没有公共无参数构造函数,因此操作失败。

这也可以使用内置的JavaScriptSerializer完成,如下所示:

 object result = new JavaScriptSerializer().DeserializeObject(JSONData); 

这将返回一个具有键值对的object []实例。

最近我一直在使用令人敬畏的JsonFx.Net库 ,我开始欣赏它的作用。 您可以使用Nuget Package Manager在Visual Studio中安装它。

代码是这样的,

 var reader = new JsonReader(); string input = @"{ ""first"": ""Foo"", ""last"": ""Bar"" }"; var template = new { first=String.Empty, middle=String.Empty, last=String.Empty }; var output = reader.Read(input, template); 

如您所见,您甚至可以为匿名类型指定模板。