Pergunta

Eu tenho um caso de teste de um problema que estou tendo, basicamente, eu criar um objeto json no servidor e fornecê-lo de volta a um AJAX chamada feita no lado do cliente. Esta coima funciona, no entanto, quando tento enviá-lo para trás e desserializá-lo do lado do servidor eu recebo a seguinte exceção:

Sem construtor sem parâmetros definidos para o tipo de 'System'.

System.MissingMethodException em System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject (IDictionary2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) at system.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) at system.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject) at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer) at System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary2 rawParams) a System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams (Object alvo, IDictionary2 parameters) at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary2 rawParams) em System.Web.Script.Services.RestHandler.ExecuteWebServiceCall (HttpContext contexto, WebServiceMethodData methodData)

Default.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <script src="http://www.json.org/json2.js" type="text/javascript"></script>
    <script src="http://code.jquery.com/jquery-latest.pack.js" type="text/javascript" ></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $.theDate = {};
            $("#Button1").click(function(){
                $.ajax({
                    type: 'POST',
                    url: 'default.aspx/getDate',
                    data: '{}',
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function(json){
                        var date = eval("("+json.d+")");
                        $.theDate = date;
                        var pdate = eval("("+json.d.replace(/"\\\/Date\(([0-9]+)[0-9-]+\)\\\/"/gi, 'new Date(parseInt($1,10))')+")");
                        $("#now").val(date.now);
                        $("#pnow").val(pdate.now);
                        $("#strnow").val(date.strnow);
                    },
                    error: function(xmlhr, status, err){
                        console.error(arguments);
                        var response = eval("("+xmlhr.responseText+")");
                        console.log(response);
                    }
                });
            });

            $("#Button2").click(function(){
                var json = JSON.stringify($.theDate);
                json = '{"json":'+json+'}';
                $.ajax({
                    type:'POST',
                    url:'default.aspx/deserialize',
                    data: json,
                    contentType:'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function(json){
                        var date = eval("("+json.d+")");
                        console.log(date);
                    },
                    error: function(xmlhr, status, err){
                        console.error(arguments);
                        var response = eval("("+xmlhr.responseText+")");
                        console.log(response);
                    }
                });
            });
        });
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="Button1" type="button" value="Get Date" /><br />
        date.now: <input type="text" id="now" value="" style="width:20em" /><br />
        date.now processed: <input type="text" id="pnow" value="" style="width:30em"><br />
        date.strnow: <input type="text" id="strnow" value=""  style="width:20em"/>
        <input id="Button2" type="button" value="Send Date" /><br />
    </div>
    </form>
</body>
</html>

Default.aspx.vb

Imports System.Web.Services
Imports Newtonsoft.Json

Partial Class _Default
    Inherits System.Web.UI.Page

    Private Class _date
        <JsonProperty()> Public now As New Date
        <JsonProperty()> Public strnow As String
        Public Sub New()
            now = Date.Today
            strnow = Date.Today.ToLongDateString
        End Sub
    End Class

    <WebMethod()> Public Shared Function getDate() As String
        Dim theDate As New _date
        Dim strJson As String

        strJson = JsonConvert.SerializeObject(theDate)

        Return strJson
    End Function

    <WebMethod()> Public Shared Function deserialize(ByVal json As String) As String
        Dim newDate As _date
        Try
            newDate = JsonConvert.DeserializeObject(json, GetType(_date))
            Return "{""done"":true}"
        Catch ex As Exception
            Throw ex
        End Try
    End Function
End Class

Eu apreciaria muito ajuda no que estou fazendo de errado aqui. Agradecemos antecipadamente.

Foi útil?

Solução

teve que mudar

Private Class _date 

para

Public Class _date

e

<WebMethod()> Public Shared Function deserialize(ByVal json As String) As String

para

<WebMethod()> Public Shared Function deserialize(ByVal json As _date) As String
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top