Suchen

Suche

Aktuell

  • Aktuell
  • Kommentare
  • TagCloud
  • Bis jetzt sind noch keine Kommentare geschrieben worden
 .Net   Suche   ASP.Net   Asp.Net   Beta   Buchtipp   C#   CentOS   CoD   DateTime   DiceFight   Funktion   HTML   HowTo   HttpWebRequest   IIS7   JSON   Konfiguration   LCD   Lighttpd   Linux   Media   Microsoft   Mobile   Mono   MySQL   Oracle   Outlook   PHP   PostgreSQL   Programme   Quake3   RC   RealURL   SMTPE   SVN   Server   Snippet   TYPO3   Timeout   Treiber   Tutorial   USB   Vista   WebClient   Windows   bauer-martin.com   bm_chart   ffmpeg   x64 

Randnotiz

W3C

Valid XHTML Valid CSS

Tutorials, .Net - 23.02.2009 19:25 - Alter: 1 yrs
- Keine Kommentare

C#: DataSet/DataTable zu JSON-String mit JavaScriptSerializer

Tags: .Net, C#, DataSet, DataTable, JSON, JavaScriptSerializer

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.



Blink del.icio.us Digg Furl Google Simpy Spurl Technorati Yahoo

Kommentare

  • Bis jetzt sind noch keine Kommentare geschrieben worden

Kommentar schreiben

Ins Gästebuch eintragen
CAPTCHA Bild zum Spamschutz