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

时间:2011-08-15 15:17:00

标签: c# .net json .net-4.0

我正在使用System.Web.Helpers.Json将某些JSON反序列化为NET 4中的dynamic。以下行因此错误而失败: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并且它有效。这是某种配置问题吗?

[编辑]

这是实际的JSON示例。看起来内容几乎无关紧要。当它在一个全新的控制台应用程序或LINQPad中运行时,它按预期工作。但是,如果您尝试从全新的Windows窗体应用程序运行相同的代码,则会出现上述错误。

var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}");

[EDIT2]

实际上,事实证明这与项目类型无关。如果正在调试项目,则抛出异常。如果只是运行,则不会发生异常。奇怪,嗯?

4 个答案:

答案 0 :(得分:141)

我忘记了这个问题,同时我找到了答案。我认为它在微软的Connect网站上,但我不确定。现在让我们分享吧。

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

Settings / Debug

答案 1 :(得分:7)

如果您在部分信任中运行,也会发生这种情况。 检查exception description here可能的原因。

我不知道这是否适用于您,因为您没有在网络环境中运行,但这就是该链接所描述的内容:

  

在以下情况下抛出此异常:

     
      
  • 可以从部分访问从普通编译代码无法访问的私有,受保护或内部方法   使用反射信任代码。

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

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

  •   

答案 2 :(得分: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;
    }

答案 3 :(得分:1)

继Roland的回答之后:列出的一些程序集不匹配可以在AssemblyInfo.cs文件中修复。

我的AssemblyInfo中的违规行是:

[assembly: AllowPartiallyTrustedCallers]

删除它允许我访问我试图从动态加载此程序集的另一个程序集设置的公共属性(在公共类上)。