[C#] JSON serialisieren/deserialisieren

JSON-Daten liegen in einem eigenen Format vor. Um dieses Datenformat in C# abzubilden benötigt man zuerst eine oder mehrere Klassen. Der Einfachheit halber kann man sich auf der Seite http://json2csharp.com/ aus dem JSON-Datenformat automatisiert C#-Klassen bauen lassen.

Als Beispiel dient folgende JSON-Datei:

{
"SerialNumber": "05857628",
"DateTime": "1415783932",
"Meters": [{
"InputNumber": "1",
"Name": "HZ Wirkleistung BZ 90612021",
"Type": "Electricity",
"Value": 2092224.000,
"Unit": "Wirkleistung"
},
{
"InputNumber": "2",
"Name": "HZ Blindleistung BZ 90612021",
"Type": "Electricity",
"Value": 2093763.500,
"Unit": "Blindleistung"
},
]
}

Die zugehörigen C#-Klassen sehen wie folgt aus:

using System.Collections.Generic;
using System.Runtime.Serialization;

namespace JSONTest
{
    [DataContract]
    public class Meter
    {
        [DataMember]
        public string InputNumber { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Type { get; set; }
        [DataMember]
        public double? Value { get; set; }
        [DataMember]
        public string Unit { get; set; }
    }

    [DataContract]
    public class Meter_List
    {
        [DataMember]
        public string SerialNumber { get; set; }
        [DataMember]
        public string DateTime { get; set; }
        [DataMember]
        public List<Meter-> Meters { get; set; }
    }
}

Im Code greift man nun folgendermaßen auf die Daten zu:

// im Projektbaum Verweis hinzufügen: System.Runtime.Serialization
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

private void btnGetJSON_Click(object sender, EventArgs e)
{
	// JSON-File von URL holen
	string contents = new System.Net.WebClient().DownloadString("www.datenquelle.de");

	// JSON deserialisieren
	DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Meter_List));
	MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(contents));
	Meter_List obj = (Meter_List)ser.ReadObject(stream);

	// Daten ausgeben
	Console.WriteLine(obj.SerialNumber);
	Console.WriteLine(obj.Meters.Count);
	Console.WriteLine(obj.Meters[0].Name);
}

Quelle: Serializing and Deserializing JSON in C#

[C#] HTML-Seite mittels HttpWebRequest und HttpWebResponse laden

using System.IO;
using System.Net;

private string GetHtml(string url)
{
    HttpWebRequest request = null;
    HttpWebResponse response = null;
    StreamReader sr = null;
    string html = string.Empty;

    try
    {
        request = (HttpWebRequest)HttpWebRequest.Create(url);
        response = (HttpWebResponse)request.GetResponse();

        sr = new StreamReader(response.GetResponseStream());

        html = sr.ReadToEnd();
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
    finally
    {
        if (sr != null)
        {
            sr.Close();
            sr.Dispose();
            sr = null;
        }

        if (response != null)
        {
            response.Close();
            response = null;
        }

        if (request != null)
        {
            request = null;
        }
    }

    return html;
}

[C#] Bild mittels HttpWebRequest und HttpWebResponse herunterladen

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;

private long DownloadImage(string url)
{
    HttpWebRequest request = null;
    HttpWebResponse response = null;
    long contentlength = 0;
    
    try
    {
        request = (HttpWebRequest)WebRequest.Create(url);
        response = (HttpWebResponse)request.GetResponse();

        if ((response.StatusCode == HttpStatusCode.OK ||
             response.StatusCode == HttpStatusCode.Moved ||
             response.StatusCode == HttpStatusCode.Redirect) &&
             response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
        {
            Bitmap b = new Bitmap(response.GetResponseStream());

            // do something here
            ...

            b.Dispose();
            b = null;
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
    finally
    {
        if (response != null)
        {
            contentlength = response.ContentLength;
            response.Close();
            response = null;
        }

        if (request != null)
        {
            request = null;
        }
    }
    
    // returns bytes read
    return contentlength;
}

Proxy für WebBrowser setzen

/// <summary->
/// set and enable proxy and port for IE
/// </summary->
public void SetProxy(string proxy, int port)
{
    RegistryKey RegKey = Registry.CurrentUser.OpenSubKey(&quot;Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings&quot;, true);

    // if proxy is not set, disable proxy
    if (string.IsNullOrEmpty(proxy))
    {
        RegKey.SetValue(&quot;ProxyServer&quot;, &quot;&quot;);
        RegKey.SetValue(&quot;ProxyEnable&quot;, 0);
    }
    else
    {
        // otherwise set proxy
        RegKey.SetValue(&quot;ProxyServer&quot;, proxy + &quot;:&quot; + port.ToString());
        RegKey.SetValue(&quot;ProxyEnable&quot;, 1);
    }
}

Weiterführende Links:

Flash and Proxy Support on .NET WebBrowser Controls
MS AIOCF: WebBrowser with proxy

Html-Elemente unter dem Mauszeiger ermitteln

// für "mshtml.IHTMLImgElement" unter Projekt->Verweise->Verweis hinzufügen->COM->Microsoft HTML Object Library hinzufügen
// benötigt wird außerdem ein WebBrowser-Steuerelement "webBrowser" auf dem Formular

// Ereignis, wenn WebBrowser ein Dokument fertig geladen hat
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url == webBrowser.Url)
    {
        // MouseMove-Event dem eben geladenen Dokument zuweisen
        webBrowser.Document.MouseMove += new HtmlElementEventHandler(Document_MouseMove);
    }
}

private void Document_MouseMove(object sender, HtmlElementEventArgs e)
{
    HtmlDocument doc = sender as HtmlDocument;

    if (doc != null)
    {
        HtmlElement el = doc.GetElementFromPoint(webBrowser.PointToClient(Control.MousePosition));

        if (el != null)
        {
            string sHTML = el.OuterHtml;

            mshtml.IHTMLImgElement htmImg = el.DomElement as mshtml.IHTMLImgElement;

            ...
        }
    }
}

Bild (IHTMLImgElement) mittels WebClient herunterladen

// für "mshtml.IHTMLImgElement" unter Projekt->Verweise->Verweis hinzufügen->COM->Microsoft HTML Object Library hinzufügen
// benötigt wird außerdem ein WebBrowser-Steuerelement
//
// Aufruf:
// HtmlElement el = webBrowser.Document.All[0];
// mshtml.IHTMLImgElement htmImg = el.DomElement as mshtml.IHTMLImgElement;
// if (htmImg != null)
// {
//     if (DownloadImage(htmImg, @"c:\Bilder\12345.png", ImageFormat.Png)
//     {
//         // irgendwas machen
//     }
// }

private bool DownloadImage(mshtml.IHTMLImgElement el, string sFileName, ImageFormat format)
{
    bool bRetVal = false;

    try
    {
        // WebClient für Download erzeugen
        WebClient client = new WebClient();
        // Stream an der Adresse "el.href" herunterladen
        Stream stream = client.OpenRead(el.href);

        // Stream an Bitmap übergeben und im übergebenen Format speichern
        Bitmap bitmap = new Bitmap(stream);
        bitmap.Save(sFileName, format);
        bitmap.Dispose();

        // aufräumen
        stream.Flush();
        stream.Close();
        stream.Dispose();

        client.Dispose();

        bRetVal = true;
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }

    return bRetVal;
}

Alle Bilder (IHTMLImgElement) eines HtmlDocument ermitteln

// für "mshtml.IHTMLImgElement" unter Projekt->Verweise->Verweis hinzufügen->COM->Microsoft HTML Object Library hinzufügen
// benötigt außerdem ein WebBrowser-Steuerelement
//
// Aufruf:
// List<mshtml.IHTMLImgElement-> lImages = GetImagesFromDocument(webBrowser.Document);

private List<mshtml.IHTMLImgElement-> GetImagesFromDocument(HtmlDocument doc)
{
    // Liste mit Bildern
    List<mshtml.IHTMLImgElement-> foundimages = new List<mshtml.IHTMLImgElement->();

    // alle HtmlElemente des Dokumentes durchgehen
    for (int i = 0; i < doc.All.Count; i++)
    {
        HtmlElement el = doc.All[i];

        if (el != null)
        {
            // akt. Html-Element versuchsweise zu IHTMLImgElement wandeln
            mshtml.IHTMLImgElement htmImg = el.DomElement as mshtml.IHTMLImgElement;

            // und prüfen
            if (this.IsImage(htmImg)) foundimages.Add(htmImg);
        }
    }

    return foundimages;
}

// Hilfsfunktion, um zu prüfen, ob ein IHTMLImgElement auch ein gültiges Image ist
private bool IsImage(mshtml.IHTMLImgElement htmImg)
{
    bool bRetVal = false;

    if (htmImg != null)
    {
        if (!string.IsNullOrEmpty(htmImg.fileSize))
        {
            // images mit filesize -1 sind fehlerhaft, deswegen rausfiltern
            if (int.Parse(htmImg.fileSize) -> 0)
            {
                if (!string.IsNullOrEmpty(htmImg.mimeType))
                {
                    bRetVal = true;
                }
            }
        }
    }

    return bRetVal;
}