如何正确地将JSON字符串反序列化为包含另一个类的嵌套List的类

我有以下对象图,我正在使用Jquery的$ .Ajax()将这个相同的“View”对象以JSON(字符串化)从浏览器发送到ASP.Net上的Page方法。 JAvascript反序列化适用于View类中的所有字符串和int,但My List为空。

我尝试过:使用chrome dev工具,我使用了字符串化的JSON,创建了一个unit testing并使用了DataContractJsonSerializerJavaScriptSerializerDataContractJsonSerializer对象正确地反序列化了我的对象图,但JavaScriptSerializer转储了我的List。 如何在页面方法上获得正确的反序列化?

 public class View { public string Text { get; set; } public string AnotherText { get; set; } public Int SomeInt { get; set; } public List { get; set; } } public class DataItem { public Person person {get;set} } public class Person { public int Age {get;set} } var dataa = {mqvm: mqvmJSON }; $.ajax({ type: "POST", dataType: "json", contentType: "application/json; charset=utf-8", data: JSON.stringify( dataa ), url: "GoHere.aspx/WebMethodName", success: function(data) { alert(data.d); }, error: function(jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText + ' ' + errorThrown); } }); 

而不是这个(视图obj作为参数)。

  [ScriptMethod(ResponseFormat = ResponseFormat.Json)] [WebMethod] public static string CreateResponseReview(View mqvm) { return "Success"; } 

我怎么能得到这个? (字符串参数)

  [ScriptMethod(ResponseFormat = ResponseFormat.Json)] [WebMethod] public static string CreateResponseReview(string mqvm) { //do manual JSON deserialization here. return "Success"; } 

我的JSON看起来像这样。

  { "Text": "6", "AnotherText":"wow" "SomeInt": 5, "DataItem":[ { "person":{ "Age":23 } }, { "person":{ "Age":42 } } ] } 

我想到了。

我不想使用JavascriptSerializer类,因为它转储了我的嵌套列表,因此我强制它将对象作为字符串传递给我,然后我手动反序列化它。 我也一直得到“没有为u0027system.string u0027的类型定义无参数构造函数”

请记住,U0027是一个撇号,因此运行时可能会认为有一个名为“System.string”的实际类型而不是System.string。 我的问题是 – 我没有正确划分下面名为data2的项目中的参数。 我必须在键和值周围加上“滴答声”。

 function requestHtmlFromServer(mqvmJSON) { var mqvmstring = JSON.stringify(mqvmJSON); var data2 = "{\'mqvm\':\'" + mqvmstring + "\' }"; \\<--the problem $.ajax({ type: "POST", dataType: "json", contentType: "application/json; charset=utf-8", data: data2, url: "MedicalInformation.aspx/CreateResponseReview", success: function(data) { alert(data.d); }, error: function(jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText + ' ' + errorThrown); } }); } [ScriptMethod(ResponseFormat = ResponseFormat.Json)] [WebMethod] public static string CreateResponseReview(string mqvm) { string noNewLines = mqvm.Replace("\n", ""); View viewModel = ToObjectFromJSON(noNewLines); //do my other stuff here return "Success"; } public static T ToObjectFromJSON(string jsonString) { var serializer = new DataContractJsonSerializer(typeof(T)); var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(jsonString)); var newObject = (T)serializer.ReadObject(memoryStream); memoryStream.Close(); return newObject; } 

尝试使用以下内容:

反序列化代码

 string json = "{\"text\":\"some text\",\"anotherText\":\"some more text\", \"someInt\":1, \"dataItems\":[{\"person\":{age:25}},{\"person\":{age:20}}]}"; JavaScriptSerializer serializer = new JavaScriptSerializer(); View view = serializer.Deserialize(json); 

 public class View { public string Text { get; set; } public string AnotherText { get; set; } public int SomeInt { get; set; } public List DataItems { get; set; } } public class DataItem { public Person person { get; set; } } public class Person { public int Age {get;set;} } 

JSON

 { "text":"some text", "anotherText":"some more text", "someInt":1, "dataItems": [ {"person":{age:25}}, {"person":{age:20}} ] }