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

标签 c# javascript .net asp.net json

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

我尝试了什么:使用 chrome 开发工具,我采用了字符串化的 JSON,创建了一个单元测试并同时使用了 DataContractJsonSerializerJavaScriptSerializer . DataContractJsonSerializer对象正确反序列化了我的对象图,但是 JavaScriptSerializer丢弃了我的 list 。如何在我的页面方法上获得正确的反序列化?

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

而不是这个( View 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 的项目中的参数。我不得不在键和值周围加上\' ticks\'。

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

关于c# - 如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559676/

相关文章:

Javascript使用RegEXP删除特殊字符之间(但不包括)的字符

c# - 序列化和属性

javascript - 根据点击的项目加载 javascript

c# - WPF:无法在 DataGrids 中滚动

c# - 从字符串创建 DateTime 对象

c# - DocumentDB如何对_TS进行LINQ查询?

javascript - Ajax post 发送 JSON 到方法结果为 null

asp.net - Telerik 控件未加载。我错过了什么?

c# - 检测 .NET Standard 2.1 中的异常上下文

c# - 如何在 Visual Studio Performance Analyzer 中查看毫秒而不是样本百分比