在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]]'。
我不确定这个错误意味着什么。
答案 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);
如您所见,您甚至可以为匿名类型指定模板。