Categories
jquery json.net vb.net

Deserializing json from client in json.net 3.5b2 in vb.net

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

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

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