将JSON发送到WebMethod时出错

时间:2012-02-01 22:03:51

标签: javascript jquery asp.net ajax

我无法将JSON发送到WebMethod。这是我尝试这样做的方式。如果有更好的方法,请告诉我。我想要做的是将JSON对象保存在数据库中。

的JavaScript

function TEST() {
    var str = '[{
        "Key": 6311,
        "Start": "123 Start",
        "End": "456 End ",
        "Date": "2/2/2012",
        "Order": null,
        "EstMiles": 0,
        "Stops": [
            {"StopAddy": "123 Stop Addy "},
            {"StopAddy": "456 Stop Addy"},
            {"StopAddy": "789 Stop Addy"}
        ]
    }]';    // Whitespace added for clarity

    $.ajax({
        type: "POST",
        url: "WebService1.asmx/Test",
        data: str,
        //contentType: "plain/text",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            alert(msg.d);
        },
        error: function(e) {
            alert(e.responseText);
        }
    });
} 

VB.NET

Public Function Test(ByVal o As Object()) As String
    'do your processing  
    Return "success"
End Function

Public Class [Stop]
    Public Property StopAddy() As String
        Get
            Return m_StopAddy
        End Get
        Set(ByVal value As String)
            m_StopAddy = value
        End Set
    End Property
    Private m_StopAddy As String
End Class

Public Class RootObject
    Public Property Key() As Integer
        Get
            Return m_Key
        End Get
        Set(ByVal value As Integer)
            m_Key = value
        End Set
    End Property
    Private m_Key As Integer
    Public Property Start() As String
        Get
            Return m_Start
        End Get
        Set(ByVal value As String)
            m_Start = value
        End Set
    End Property
    Private m_Start As String
    Public Property [End]() As String
        Get
            Return m_End
        End Get
        Set(ByVal value As String)
            m_End = value
        End Set
    End Property
    Private m_End As String
    Public Property [Date]() As String
        Get
            Return m_Date
        End Get
        Set(ByVal value As String)
            m_Date = value
        End Set
    End Property
    Private m_Date As String
    Public Property Order() As Object
        Get
            Return m_Order
        End Get
        Set(ByVal value As Object)
            m_Order = value
        End Set
    End Property
    Private m_Order As Object
    Public Property EstMiles() As Integer
        Get
            Return m_EstMiles
        End Get
        Set(ByVal value As Integer)
            m_EstMiles = value
        End Set
    End Property
    Private m_EstMiles As Integer
    Public Property Stops() As List(Of [Stop])
        Get
            Return m_Stops
        End Get
        Set(ByVal value As List(Of [Stop]))
            m_Stops = value
        End Set
    End Property
    Private m_Stops As List(Of [Stop])
End Class

我得到的错误是

  

{“Message”:“Type \ u0027System.Collections.Generic.IDictionary`2 [[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Object,mscorlib,版本= 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] \ u0027不支持反序列化数组。“,”StackTrace“:”

  在System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList列表,Type类型,JavaScriptSerializer序列化程序,Boolean throwOnError,IList& convertedList)
  在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object& convertedObject)\ r \ n

  at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object& convertedObject)\ r \ n

  at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o,Type type,JavaScriptSerializer serializer)\ r \ n

  at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)\ r \ n

  在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串输入)\ r \ n

  at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context,JavaScriptSerializer serializer)\ r \ n

  在System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData,HttpContext context)\ r \ n

  在System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context,WebServiceMethodData methodData)“,
  “ExceptionType”: “System.InvalidOperationException”}

1 个答案:

答案 0 :(得分:2)

根据您的堆栈跟踪,我假设您在服务器端使用Asp.net? 如果是这样,我相信Asp.net要求你有一个主对象包装json数据的对象列表。因此,请将您的输入更改为以下内容,并稍微更改您的服务器代码以处理额外的包装层:

var str = '{
"data": 
[
    {
        "Key": 6311,
        "Start": "123 Start",
        "End": "456 End ",
        "Date": "2/2/2012",
        "Order": null,
        "EstMiles": 0,
        "Stops": [
            {
                "StopAddy": "123 Stop Addy "
            },
            {
                "StopAddy": "456 Stop Addy"
            },
            {
                "StopAddy": "789 Stop Addy"
            }
        ]
    }
]
}'