如何正确地将 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,创建了一个单元测试并同时使用了 DataContractJsonSerializerJavaScriptSerializerDataContractJsonSerializer 对象正确反序列化了我的对象图,但 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?

如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?

如何正确地将元组序列化为键字典

如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?

将Json字符串反序列化为对象java