
Mittels JavaScriptSerializer lassen sich unter .Net ganz einfach Objekte in einen JSON String serialisieren. Jedoch gibt es bei DataSets und DataTables eine InvalidOperationException. Dies liegt daran, dass der JavaScriptSerializer keine DataTable serialisieren kann. Um das Problem zu umgehen, gibt es im Netz viele verschiedene Lösungen, wobei jedoch nur selten eine Funktioniert. Die beste und einfachste Möglichkeit besteht darin, eine JavaScriptConverter für DataTables selber zu schreiben. Wenn man nur Serialisieren will, und nicht Deserialisieren, geht das auch ziemlich einfach und schnell. Dazu benötigen wir eine neue Klasse, welche von JavaScriptConverter abgeleitet ist und die Serialize Methode überschreibt:
public class DataTableConverter : JavaScriptConverter { public override IEnumerable<Type> SupportedTypes { get { return new Type[] {typeof (DataTable)}; } } public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) { throw new NotImplementedException(); } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { DataTable listType = obj as DataTable; if (listType != null) { Dictionary<string, object> result = new Dictionary<string, object>(); ArrayList itemsList = new ArrayList(); foreach (DataRow row in listType.Rows) { Dictionary<string, object> listDict = new Dictionary<string, object>(); foreach (DataColumn dc in listType.Columns) listDict.Add(dc.ColumnName, row[dc]); itemsList.Add(listDict); } result["Rows"] = itemsList; return result; } return new Dictionary<string, object>(); } }
Jetzt noch den JavaScriptConverter in die Web.conf eintragen
<system.web.extensions> <scripting> <webServices> <jsonSerialization > <converters> <add name="DataTableAjaxFix" type="Namespace.DataTableConverter"/> </converters> </jsonSerialization>
Beim erzeugen des JavaScriptSerializers muss der Converter vor dem eigentlichen Serialisieren noch an den JavaScriptSerializers über ConverterCollections mitgeteilt werden. Danach funktioniert das serialisieren einwandfrei.