Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
37
rated 0 times [  44] [ 7]  / answers: 1 / hits: 22996  / 15 Years ago, thu, august 27, 2009, 12:00:00

I have an object, it has a DateTime property... I want to pass that object from an .ashx handler back to a webpage via AJAX/JSON... I don't want to use 3rd party controls...



when I do this:



  new JavaScriptSerializer().Serialize(DateTime.Now);


I get this:



  /Date(1251385232334)/


but I want 8/26/2009 (nevermind localization... my app is very localized, so my date formatting assumptions are not up for debate in this question). If I make/register a custom converter



public class DateTimeConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new List<Type>() { typeof(DateTime), typeof(DateTime?) }; }
}

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
Dictionary<string, object> result = new Dictionary<string, object>();
if (obj == null) return result;
result[DateTime] = ((DateTime)obj).ToShortDateString();
return result;
}

public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
if (dictionary.ContainsKey(DateTime))
return new DateTime(long.Parse(dictionary[DateTime].ToString()), DateTimeKind.Unspecified);
return null;
}
}


then I get this result (since the return value of the custom serialize method is a dictionary):



{DateTime:8/27/2009}


so now in my Javascript, instead of doing



somePerson.Birthday


I have to do



somePerson.Birthday.DateTime 

or

somePerson.Birthday[DateTime]


how can I make the custom converter return a direct string so that I can have clean Javascript?


More From » .net

 Answers
332

JavaScriptSerializer can definitely do what you desire.



It's possible to customize the serialization performed by JavaScriptSerializer for any type by creating a custom converter and registering it with the serializer. If you have a class called Person, we could create a converter like so:



public class Person
{
public string Name { get; set; }
public DateTime Birthday { get; set; }
}

public class PersonConverter : JavaScriptConverter
{
private const string _dateFormat = MM/dd/yyyy;

public override IEnumerable<Type> SupportedTypes
{
get
{
return new[] { typeof(Person) };
}
}

public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
Person p = new Person();
foreach (string key in dictionary.Keys)
{
switch (key)
{
case Name:
p.Name = (string)dictionary[key];
break;

case Birthday:
p.Birthday = DateTime.ParseExact(dictionary[key] as string, _dateFormat, DateTimeFormatInfo.InvariantInfo);
break;
}
}
return p;
}

public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
Person p = (Person)obj;
IDictionary<string, object> serialized = new Dictionary<string, object>();
serialized[Name] = p.Name;
serialized[Birthday] = p.Birthday.ToString(_dateFormat);
return serialized;
}
}


And use it like this:



JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new PersonConverter() });

Person p = new Person
{
Name = User Name,
Birthday = DateTime.Now
};

string json = serializer.Serialize(p);
Console.WriteLine(json);
// {Name:User Name,Birthday:12/20/2010}

Person fromJson = serializer.Deserialize<Person>(json);
Console.WriteLine(String.Format({0}, {1}, fromJson.Name, fromJson.Birthday));
// User Name, 12/20/2010 12:00:00 AM

[#98821] Saturday, August 22, 2009, 15 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
marinal

Total Points: 655
Total Questions: 99
Total Answers: 99

Location: Svalbard and Jan Mayen
Member since Sun, Sep 25, 2022
2 Years ago
;