Deserializing json from client in json.net 3.5b2 in vb.net
Question
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(IDictionary
2 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.
Solution
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