将JSON反序列化为匿名对象

jda*_*vis 41 c# asp.net json

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

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

但是,我希望以后能够将JSON字符串反序列化为匿名对象.像这样......

var obj2 = serializer.Deserialize(output, object);
Run Code Online (Sandbox Code Playgroud)

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

我试过这个......

var obj2 = serializer.Deserialize(output, obj.GetType());
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

没有为'<> 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]]'.

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

Vin*_*Vin 32

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

您可以使用DeserializeAnonymousType方法.

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

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

  • ServiceStack不是免费的!对我来说这很重要.我才发现当我达到免费版本的极限时. (4认同)

i31*_*nGo 26

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

dynamic myObject = JsonConvert.DeserializeObject<dynamic>(output);

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*old 14

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

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

var obj2 = serializer.Deserialize(output, obj.GetType());
Run Code Online (Sandbox Code Playgroud)

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


Xtr*_*ity 5

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

object result = new JavaScriptSerializer().DeserializeObject(JSONData);
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,这不在 .net core 2.1 中。 (2认同)