发送错误JSON来的WebMethod [英] Error sending JSON to WebMethod

查看:159
本文介绍了发送错误JSON来的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆