尝试通过方法'System.Web.Helpers.Json..cctor()'访问方法'System.Web.Helpers.Json.CreateSerializer()'失败。

64

我正在使用System.Web.Helpers.Json将一些JSON反序列化为dynamic,在NET 4中,以下行失败,并显示以下错误:TypeInitializationException: Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed.

var json = Json.Decode(response);
response是一段冗长但有效的JSON。可能是什么问题?我已经尝试了使用手工创建的短JSON在LINQPad上进行测试,它可以正常工作。这是某种配置问题吗?
[EDIT]
这里是实际的样本JSON。似乎内容并不重要。当在全新的控制台应用程序或LINQPad中运行时,它按预期工作。但是如果您尝试从全新的Windows Forms应用程序运行相同的代码,则会出现上述错误。
var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}");

[编辑2]

实际上,这与项目类型无关。如果正在调试该项目,就会抛出异常。如果只是运行,异常就不会发生。很奇怪,是吧?


1
请展示JSON和您正在使用的反序列化代码。 - casperOne
1
我已经编辑了问题,包括一个示例JSON和一个额外的说明,用于重现问题。 - wpfwannabe
1
TypeInitializationException 是否有 InnerException?它可能会提供更多关于失败的信息。 - akton
1
我遇到了同样的问题。@akton:我会把我的堆栈跟踪作为下面的“答案”添加。 - Manny
你使用的是哪个版本的VS?如果你同时安装了多个不匹配的VS和.NET运行时,程序可能会正常运行但无法进行调试。 - Akash Kava
你能否发送给我 system.web.helpers 的 DLL 版本号? - VIRA
4个回答

142

我忘了这个问题,后来在寻找中找到了答案。我想它应该是在微软的Connect网站上某个地方,但我不确定。所以现在让我们分享一下。

基本上,为了解决这个问题,你需要确保在 Debug 下你的项目设置中 "启用 Visual Studio 托管进程" 是 未选中 的。我不确定为什么会出现这种情况,但这绝对是一个 "修复" 它的方法。一旦我发现了这个方法,我就停止寻找答案了。这对我来说已经足够好了。

设置/调试


2
我不确定那是否合适。这只有我来决定吗?我认为提供赏金的人有权决定这件事(或者我错了吗?)。 - wpfwannabe
7
对我很有帮助。我无法想象如果没有你的话,我将如何开始独自寻找这个。 - Dan Bailiff
谢谢你的提示,伙计!它帮助我解决了同样的问题。 - virious
1
为什么需要禁用此选项才能将JSON字符串序列化为动态对象呢?虽然似乎可以正常工作,但这并不是解决问题的好方法。 - malthe
4
对于未来的谷歌用户,这个解决方法也适用于错误信息"Attempt by method 'System.Web.Helpers.Json.Decode(System.String)' to access field 'System.Web.Helpers.Json._serializer' failed."。 - user1568891
显示剩余3条评论

7
如果您正在使用部分信任,则也可能会发生这种情况。 请查看此处的异常说明,了解可能的原因。
我不知道这是否适用于您,因为您没有在 Web 上下文中运行,但这就是链接描述的内容:
此异常在以下情况下抛出:
  • 通过反射从部分受信任的代码访问无法从正常编译的代码访问的私有、受保护或内部方法。

  • 从透明代码访问安全关键方法。

  • 类库中方法的访问级别已更改,并且一个或多个引用该库的程序集未被重新编译。


4

内置的json类存在问题。

如果你想用其他方法实现,请使用以下代码:

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new DynamicJavaScriptConverter[] { new DynamicJavaScriptConverter() });
var result = WrapObject(serializer.DeserializeObject(value)); // here you will have result.

private object WrapObject(object value)
    {
        IDictionary<string, object> values = value as IDictionary<string, object>;
        if (values != null)
        {
            return new DynamicJsonObject(values);
        }
        object[] arrayValues = value as object[];
        if (arrayValues != null)
        {
            return new DynamicJsonArray(arrayValues);
        }
        return value;
    }

“DynamicJavaScriptConverter” 在 .Net Framework 中吗?在哪里? - dumbledad

1
进一步回答Roland的问题:一些列举出来的汇编不匹配可以在AssemblyInfo.cs文件中进行修复。
我AssemblyInfo中有问题的行是这个:
[assembly: AllowPartiallyTrustedCallers]

移除这个限制后,我可以访问公共类中的公共属性(另一个程序集动态加载了该程序集),并对其进行设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接