如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类
Posted
技术标签:
【中文标题】如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类【英文标题】:How to correctly deserialize a JSON string into the class that contains a nested List of another class 【发布时间】:2011-11-25 10:59:15 【问题描述】:我有以下对象图,我正在使用 Jquery 的 $.Ajax() 将这个相同的 JSON(字符串化)“视图”对象从浏览器发送到 ASP.Net 上的页面方法。 javascript 反序列化适用于 View 类中的所有字符串和 int,但 My List<DataItem>
为空。
我尝试了什么:使用 chrome 开发工具,我采用了字符串化的 JSON,创建了一个单元测试并同时使用了 DataContractJsonSerializer
和 JavaScriptSerializer
。 DataContractJsonSerializer
对象正确反序列化了我的对象图,但 JavaScriptSerializer
转储了我的列表。如何在我的页面方法上获得正确的反序列化?
public class View
public string Text get; set;
public string AnotherText get; set;
public Int SomeInt get; set;
public List<DataItem> 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
]
【问题讨论】:
你能举一个 JSON 的例子吗? 【参考方案1】:我想通了。
我不想使用 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<View>(noNewLines);
//do my other stuff here
return "Success";
public static T ToObjectFromJSON<T>(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;
【讨论】:
我已经使用 jQuery / VB.NET 几个月了,在尝试发送没有定义模型的对象时遇到了这些问题。感谢您分享您的答案。【参考方案2】:尝试使用以下方法:
反序列化代码
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<View>(json);
类
public class View
public string Text get; set;
public string AnotherText get; set;
public int SomeInt get; set;
public List<DataItem> 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
]
【讨论】:
这在调用 web 方法后在服务器端起作用,但这不是我需要它的地方。我需要 web 方法接受一个字符串参数并让我手动调用反序列化器或让 JavascriptSerializer 在 asp.net 调用 web 方法之前正确反序列化集合。以上是关于如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类的主要内容,如果未能解决你的问题,请参考以下文章
如何正确地将复杂的 Swift 对象序列化/反序列化为 AWS Lambda 有效负载?
如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?