发送错误JSON来的WebMethod [英] Error sending JSON to WebMethod
问题描述
我无法发送JSON到一个WebMethod。下面是我试图做到这一点。如果有更好的方法来做到这一点,请让我知道。我所试图做的是保存JSON对象关在一个数据库中。
的JavaScript
函数test(){
VAR海峡='[{
重点:6311,
开始:123开始,
结束:456结束,
日期:2012/2/2
订单:空,
EstMiles:0,
停止:
{StopAddy:123停止阿迪},
{StopAddy:456停止阿迪},
{StopAddy:789停止阿迪}
]
}]; //添加空格为清楚起见,
$阿贾克斯({
键入:POST,
网址:WebService1.asmx /测试,
数据:海峡,
//的contentType:纯/文本,
的contentType:应用/ JSON的;字符集= UTF-8,
数据类型:JSON,
成功:函数(MSG){
警报(msg.d);
},
错误:函数(E){
警报(e.responseText);
}
});
}
VB.NET
公共功能测试(BYVALÔ为对象())作为字符串
做你的处理
返回成功
端功能
公共类[停止]
公共财产StopAddy()作为字符串
得到
返回m_StopAddy
最终获取
设置(BYVAL值作为字符串)
m_StopAddy =价值
结束设定
高端物业
私人m_StopAddy作为字符串
末级
公共类RootObject
公共属性键()作为整数
得到
返回m_Key
最终获取
设置(BYVAL值作为整数)
m_Key =价值
结束设定
高端物业
私人m_Key作为整数
公共属性开始()作为字符串
得到
返回M_START
最终获取
设置(BYVAL值作为字符串)
M_START =价值
结束设定
高端物业
私人M_START作为字符串
公共属性[完]()作为字符串
得到
返回m_End
最终获取
设置(BYVAL值作为字符串)
m_End =价值
结束设定
高端物业
私人m_End作为字符串
公共属性[日期]()作为字符串
得到
返回m_Date
最终获取
设置(BYVAL值作为字符串)
m_Date =价值
结束设定
高端物业
私人m_Date作为字符串
公共产权制度()为对象
得到
返回m_Order
最终获取
设置(BYVAL值作为对象)
m_Order =价值
结束设定
高端物业
私人m_Order作为对象
公共财产EstMiles()作为整数
得到
返回m_EstMiles
最终获取
设置(BYVAL值作为整数)
m_EstMiles =价值
结束设定
高端物业
私人m_EstMiles作为整数
公共属性停止()方式列表(作者[停止])
得到
返回m_Stops
最终获取
设置(BYVAL值作为列表(作者[停止]))
m_Stops =价值
结束设定
高端物业
私人m_Stops方式列表(作者[停止])
末级
我得到的错误是
{消息:类型\ u0027System.Collections.Generic.IDictionary`2 [System.String,mscorlib程序,版本= 2.0.0.0,文化=中性公钥= b77a5c561934e089],[System.Object的,mscorlib程序,版本= 2.0.0.0,文化=中性公钥= b77a5c561934e089]] \ u0027不支持数组的反序列化,堆栈跟踪。:
在System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList的列表,类型类型,JavaScriptSerializer序列化,布尔throwOnError,IList的&放大器; convertedList)
在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(对象o,类型类型,JavaScriptSerializer序列化,布尔throwOnError,对象和放大器; convertedObject)\ r \ñ
在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象o,类型类型,JavaScriptSerializer序列化,布尔throwOnError,对象和放大器; convertedObject)\ r \ñ
在System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(对象o,类型类型,JavaScriptSerializer串行)\ r \ñ
在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer串,字符串输入,输入型的Int32 depthLimit)\ r \ñ
在System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](字符串输入)\ r \ñ
在System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext的背景下,JavaScriptSerializer串行)\ r \ñ
在System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData,HttpContext的背景下)\ r \ñ
在System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext的背景下,WebServiceMethodData methodData),
ExceptionType:System.InvalidOperationException}
根据您的堆栈跟踪,我认为你是在服务器端使用Asp.net? 如果是的话,我相信Asp.net需要你有一个包装的JSON数据对象的名单主要对象。所以,请更改您输入以下内容,改变你的服务器codeA位来处理额外的包装层:
VAR海峡='{
数据:
[
{
重点:6311,
开始:123开始,
结束:456结束,
日期:2012/2/2
订单:空,
EstMiles:0,
停止:
{
StopAddy:123停止阿迪
},
{
StopAddy:456停止阿迪
},
{
StopAddy:789停止阿迪
}
]
}
]
}
I am having trouble sending JSON to a WebMethod. Here is the way that I am trying to do it. If there is a better way to do this please let me know. What I am trying to do is save the JSON object off in a database.
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
The error I am getting is
{"Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.","StackTrace":"
at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList& convertedList)
at 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
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.InvalidOperationException"}
Based on your stack trace, I assume you are using Asp.net on the server side? If so, I believe Asp.net requires you to have a main object that wraps list of objects for json data. So, please change your input to the following, and change your server code a bit to handle the extra wrapping layer:
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"
}
]
}
]
}'
这篇关于发送错误JSON来的WebMethod的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!