【问题标题】:"Value cannot be null" error when deserializing json using C# / JavaScriptSerializer使用 C#/JavaScriptSerializer 反序列化 json 时出现“值不能为空”错误
【发布时间】:2009-10-07 19:02:08
【问题描述】:

我正在尝试将我从 asmx 服务中获取的一些 JSON 反序列化为对象列表。类中的所有字段都匹配 JSON 中的字段,JSON 返回有效,但出现看似神秘的错误:

值不能为空。参数名称:类型。

我的任何对象中都没有名为 type 的参数。有没有人见过这个?

这是引发错误的代码。

System.Web.Script.Serialization.JavaScriptSerializer serr = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Rejection> l = serr.Deserialize<List<Rejection>>(json);

json 是一个早先声明的字符串,并返回与我类中的字段匹配的有效 json。您要反序列化到的类的名称是否必须与 json 中的 __type 属性中的内容匹配?

【问题讨论】:

  • 你能贴一些代码sn-p吗?

标签: asp.net-ajax


【解决方案1】:

我也得到了这个 - 我相信这与在没有类型解析器的情况下初始化序列化器有关:

// The following fails
var serialiser = new JavaScriptSerializer();
MyClass obj = serialiser.Deserialize<MyClass>(input);

// But the following works fine
var serialiser = new JavaScriptSerializer(new SimpleTypeResolver());
MyClass obj = serialiser.Deserialize<MyClass>(input);

我发现只有在反序列化具有 __type 属性的 JSON 时出现此错误(仅在使用类型解析器进行序列化时才会出现)。如果您的 JSON 没有 __type 属性,则反序列化似乎可以使用上述任一方法正常工作。

【讨论】:

  • 我遇到了和 OP 一样的问题,尝试这个会给我错误Operation is not valid due to the current state of the object.
  • @Shredder 我猜这个异常是另一个单独的问题,只有在解决第一个问题后才能看到。
  • 是的,如果我没记错的话,我是通过从 json 字符串中解析出 __type 来解决的。
  • 如果您仍然遇到此问题,我认为您需要使用 JSON.stringify(yourObj) 来准备您的字符串,然后再将其发送到 Web 服务。我有相同的错误消息(对象的..当前状态)并使用此方法解决它
【解决方案2】:

我不确定您的问题到底出在哪里,但请尝试以下代码:


string input = "..."; // your asmx data
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<YourCustomClass> novos = new List<YourCustomClass>(
    serializer.Deserialize<YourCustomClass[]>(input)));

【讨论】:

    【解决方案3】:

    我通过避免使用 javascript 序列化程序并使用 json.net 库解决了我的问题。像魅力一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 2015-01-11
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多