views:

3994

answers:

1

I have a test case of a problem I'm having, basically I create a json object on the server and provide it back to an AJAX called made on the client side. That works fine, however, when I try to send it back and deserialize it server side I get the following exception:

No parameterless constructor defined for type of 'System.String'.

System.MissingMethodException at 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) at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary2 parameters) at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary2 rawParams) at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, 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"&gt;

<html xmlns="http://www.w3.org/1999/xhtml"&gt;
<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

I'd greatly appreciate help on what I'm doing wrong here. Thanks in advance.

+2  A: 

Had to change

Private Class _date

to

Public Class _date

and

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

to

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