6

我有一个结构如下的 js 对象:

object.property1 = "some string";
object.property2 = "some string";
object.property3.property1 = "some string";
object.property3.property2 = "some string";
object.property3.property2 = "some string";

我正在使用 JSON.stringify(object) 通过 ajax 请求传递它。当我尝试使用 JavaScriptSerializer.Deserialize 作为字典对其进行反序列化时,出现以下错误:

没有为“System.String”类型定义无参数构造函数。

这个完全相同的过程适用于具有非“集合”属性的常规对象..感谢您的帮助!

4

2 回答 2

9

这是因为反序列化器不知道如何处理子对象。您在 JS 中拥有的是:

var x = {
  'property1' : 'string',
  'property2' : 'string',
  'property3' : { p1: 'string', p2: 'string', p3: 'string' },
};

它没有映射到 C# 中有效的东西:

HashTable h = new HashTable();
h.Add("property1", "string");
h.Add("property2", "string");
h.Add("property3", ???);

这 ???是因为这里没有定义类型,那么反序列化器怎么知道你的JS中的匿名对象代表什么?

编辑

没有办法做你想要在这里完成的事情。您需要使您的对象类型化。例如,像这样定义你的类:

class Foo{
  string property1 { get; set; } 
  string property2 { get; set; }
  Bar property3 { get; set; } // "Bar" would describe your sub-object
}

class Bar{
  string p1 { get; set; }
  string p2 { get; set; }
  string p3 { get; set; }
}

...或类似的东西。

于 2010-06-02T16:33:14.833 回答
0

作为更一般的答案,在我的情况下,我的对象看起来像:

{ "field1" : "value", "data" : { "foo" : "bar" } }

我最初将数据字段作为字符串,而它应该是MSDN上为使用字典语法的对象Dictionary<string, string>指定的。

public class Message
{
   public string field1 { get; set; }

   public Dictionary<string, string> data { get; set; }
}
于 2011-10-25T21:11:48.710 回答