JavaScriptSerializer将对象“collection”反序列化为对象失败的属性

时间:2010-06-02 16:27:36

标签: javascript asp.net-ajax serialization javascriptserializer

我有一个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'类型定义无参数构造函数。

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

2 个答案:

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

......或者那种效果。

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