Jquery 在webservice中解析JSON并返回值

Jquery 在webservice中解析JSON并返回值,jquery,Jquery,我正在开发一个Web服务和一个jQuery AJAX。它将获取一个模态对话框,并从模态对话框获取输入,将其放入一个对象中,然后将一个布尔结果从webservice返回给jQueryAjax调用 代码如下: $('[id*="dialog"]').dialog({ autoOpen: false, modal: true, resizable: false, show: "blind", hide: "puff", buttons: {

我正在开发一个Web服务和一个jQuery AJAX。它将获取一个模态对话框,并从模态对话框获取输入,将其放入一个对象中,然后将一个布尔结果从webservice返回给jQueryAjax调用

代码如下:

$('[id*="dialog"]').dialog({
    autoOpen: false,
    modal: true,
    resizable: false,
    show: "blind",
    hide: "puff",
    buttons: {
        'Create': function() {
            Materials.MaterialName = $('[id*="txtMaterialName"]').val();
            Materials.QuantityType = $('[id*="txtquantity"]').val();
            var jsonMaterial = JSON.stringify(Materials);
            AddNewMaterial(jsonMaterial);
            $(this).dialog('close');
        },
        'Cancel': function() {
            $(this).dialog('close');
        }
    },
    close: function() {
         window.document.location = "ResourcePlanningMaster.aspx";          
    }
});

function AddNewMaterial(materials) {
$.ajax({
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    url: 'Services/Service.asmx/AddNewMaterial',
    data: '{"Materials":"' + materials + '"}',
    dataType: "json",
    success: function(data, textStatus) {
        if (textStatus == "success") {
            if (data.d == true) {
                alert('New Item Added');
            }
        }
    },
    error: function(data, textStatus) {
        alert('An error has occured retrieving data!');
    }
});
}

web服务如下所示:

[WebMethod]
    [ScriptMethod]
    public String AddNewMaterial(String Materials)
    {
        Boolean Result = false;
        try
        {

            MaterialEntity Material = JsonConvert.DeserializeObject<MaterialEntity>(Materials);
            Result = JsonHelper.InsertMaterial(Material);
        }
        catch (Exception ex)
        {

            logger.Error(ex.Message);
            logger.Fatal(ex.InnerException);
        }
        return Result.ToString();
    }
现在,当我在web服务中单击“创建”按钮时,我在data.responseText中得到的错误是:

{"Message":"Invalid object passed in, \u0027:\u0027 or \u0027}\u0027 expected. (17): {\"Materials\":\"{\"MaterialName\":\"assd\",\"QuantityType\":\"asd\"}\"}","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
尽管我将其解析为json,然后将其反序列化为MaterialEntity类本身,但为什么我会得到这样的结果?导致此错误的原因是什么?

请尝试使用下一个代码

数据:“{”材料“:“+材料+”}”

而不是示例中的数据行(MaterialEntity对象周围没有双引号)

{"Message":"Invalid object passed in, \u0027:\u0027 or \u0027}\u0027 expected. (17): {\"Materials\":\"{\"MaterialName\":\"assd\",\"QuantityType\":\"asd\"}\"}","StackTrace":"   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}