JavaScriptSerializer反序列化对象中的属性“collection”失败。

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”类型未定义无参构造函数。
对于常规对象和非“集合”属性,这个完全相同的过程是有效的.. 谢谢任何帮助!
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; }
}

...或类似的东西。


该句话意为“或者类似的事情”。

这是对我的原始问题的很好的阐述。你有答案吗?谢谢! - bill
好的,那很有道理,也很容易。一旦我把它们输入了,我如何再次对整个内容进行反序列化? - bill
1
我不熟悉JavaScriptSerializer,但我猜测:Foo foo = JavaScriptSerializer.Deserialize<Foo>(incomingJson); - Jerod Venema

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; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接