【问题标题】:Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed尝试通过方法“System.Web.Helpers.Json..cctor()”访问方法“System.Web.Helpers.Json.CreateSerializer()”失败
【发布时间】:2011-10-27 08:38:30
【问题描述】:

我正在使用 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。这可能是什么问题?我已经尝试LINQPad 使用简短的手工 JSON 并且它有效。这是某种配置问题吗?

[编辑]

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

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

[编辑2]

实际上,这与项目类型无关。如果正在调试项目,则会引发异常。如果只是简单地运行,则不会发生异常。奇怪吧?

【问题讨论】:

  • 请显示 JSON 和您用于反序列化它的代码。
  • 我已对问题进行了编辑,以包含示例 JSON 和有关如何重现的附加说明。
  • TypeInitializationException 是否存在 InnerException?它可能会为您提供有关失败原因的更多信息。
  • 我遇到了同样的问题。 @akton:我将在下面添加我的堆栈跟踪作为“答案”。
  • VS 哪个版本?如果你有多个不匹配版本的 VS 和 .net 运行时,它会正常运行,但会调试失败。

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


【解决方案1】:

进一步了解 Roland 的回答:列出的一些程序集不匹配可以在 AssemblyInfo.cs 文件中修复。

我的 AssemblyInfo 中的违规行是这样的:

[assembly: AllowPartiallyTrustedCallers]

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

【讨论】:

    【解决方案2】:

    内置的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 框架中吗?在哪里?
    【解决方案3】:

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

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

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

    • 无法从正常编译代码访问的私有、受保护或内部方法可从部分访问 使用反射的可信代码。

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

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

    【讨论】:

      【解决方案4】:

      我忘记了这个问题,同时我找到了答案。我认为它在 Microsoft 的 Connect 网站上的某个地方,但我不确定。那么现在就分享给大家吧。

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

      【讨论】:

      • 我不确定这是否合适。这只是我的电话吗?我认为提供赏金的人都有权获得这个(或者我错了吗?)。
      • @wpfwannabe 请在您的回答评论中添加,对于使用“Json.Decode”代码引用原始项目的任何项目,必须取消选中此选项。
      • 为我工作。我无法想象我是如何开始自己找到这个的。
      • 为什么必须禁用此选项才能将 JSON 字符串序列化为动态对象?虽然它似乎有效,但这并不是解决问题的好方法。
      • 对于未来的 Google 员工,此解决方案还有助于解决错误“尝试通过方法 'System.Web.Helpers.Json.Decode(System.String)' 访问字段 'System.Web.Helpers .Json._serializer' 失败。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      相关资源
      最近更新 更多