将JSON反序列化为匿名对象

时间:2011-08-01 21:43:04

标签: c# asp.net 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 = neutral,PublicKeyToken = b77a5c561934e089]]'。

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

5 个答案:

答案 0 :(得分:31)

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

中使用JSON

您可以使用方法DeserializeAnonymousType

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

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

答案 1 :(得分:21)

动力学怎么样,我看到的最快的方式是:

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

decimal Amount = Convert.ToDecimal(myObject.Amount);
string Message = myObject.Message;

注意:  您将需要Newtonsoft.json.dll参考

答案 2 :(得分:14)

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

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

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

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

答案 3 :(得分:5)

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

:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72300Library UP-TO-DATE
:app:prepareComAndroidSupportMultidex101Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42300Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:compileDebugJavaWithJavac UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources UP-TO-DATE
:app:collectDebugMultiDexComponents
:app:packageAllDebugClassesForMultiDex
:app:shrinkDebugMultiDexComponents
:app:createDebugMainDexClassList FAILED
Error:Execution failed for task ':app:createDebugMainDexClassList'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 1
Information:BUILD FAILED
Information:Total time: 21.207 secs
Information:1 error
Information:0 warnings
Information:See complete output in console

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

答案 4 :(得分:1)

最近我一直在使用真棒JsonFx.Net library,我开始欣赏它的作用。您可以使用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);

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