Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using .NET JavaScriptSerializer.Deserialize with DateTime from client

I'm using the JavaScriptSerializer.Deserialize<>() method to convert JSON I receive from the client into a custom C# class. One of the properties of that class is a DateTime. Currently the Deserialize<>() method throws an error, saying

"(my date string)" is not a valid value for DateTime.

I've tried sending the date using several different formats, including ticks and other formats produced by the various built-in JavaScript Date() methods, but none of them have worked.

Exactly what format is the Deserialize<>() method expecting in order to parse it into a .NET DateTime?

like image 509
Nathan Friend Avatar asked Aug 07 '12 19:08

Nathan Friend


2 Answers

You are right, @friendlycello. Unfortunally, JSON.stringify() removes backslashes from this \/Date(ticks)\/ .Net serializer DateTime format.

I wrote a custom function that adjusts the output from JSON.stringify(), including these backslashes. So, I can keep almost untoched, only replacing from JSON.stringify() to customJSONstringify() in $.ajax() data: param.

function customJSONstringify(obj) {
    return JSON.stringify(obj).replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/")
}
like image 171
Eduardo Moralles Avatar answered Sep 24 '22 06:09

Eduardo Moralles


Eduardo provided a solution on the JavaScript side. You also have the option of correcting the issue on the server side.

// C# Side
var obj = Regex.Replace(json, @"/Date\((\-?\d*)\)/", @"\/Date($1)\/")

Note that I used a single replace. This is safer and more accurate than using two replace(). The same expression can be used to replace the expression in the JavaScript example.

// Safer version of function using a single replace
function customJSONstringify(obj) {
    return JSON.stringify(obj).replace(/\/Date\((\-?\d*)\)\//g, "\\/Date($1)\\/");
}

Two calls to replace() could cause the second replace to replace text that had nothing to do with the data. Note to be even safer the expression can be updated to only replace instances of /Date(.\*)/ that are preceded and followed by a single quote. That would ensure that if there was text describing the /Date(.\*)/ syntax it wouldn't get replaced.

like image 35
Luis Perez Avatar answered Sep 24 '22 06:09

Luis Perez