我有一个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'类型定义无参数构造函数。
这个完全相同的过程适用于具有非“集合”属性的常规对象..感谢您的帮助!
答案 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; }
}