Seit gefühlten Ewigkeiten hab ich schon nichts mehr mit WPF geschrieben. Wenn es sehr schnell gehen soll, nehme ich WinForms und sonst gleich die Plattform meiner Träume Silverlight die benötigt wird, wie ASP.NET oder den guten METRO Stoff. Heute WPF ausgepackt und echt Spass gehabt. Per Nuget drei Pakete ins Projekt gezogen. HTTPClient wirklich guter Stoff und JSON.NET weil ich JSON parsen möchte.
JSON.NET als 3rd Party Bibliothek meines Vertrauens (oja und in den Source Code könnte man auch reinschauen) bei der man nicht Angst haben muss, das man im Fehlerfall einen Atomkrieg oder schlimmeres auslöst.
Ziel ist eine WHOIS Abfrage mit Rückgabewert JSON statt XML. Weil man ja ein wenig auf die Internet Umwelt Rücksicht nimmt.
1: Dim hc = New HttpClient()
2: hc.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
3: Dim r As String = Await hc.GetStringAsync("http://apps.db.ripe.net/whois/lookup/ripe/inetnum/" + ip)
Österreicher werden in Anbetracht der nahenden Wahlen an den Herrn Rechtsaußen denken. Nein HC weil, ja man kann sich's denken. Variablen die nur wenige Zeilen gelten, heißen bei mir gerne mal i, ip, r oder hc.
Zurück zum Thema – cool oder? Kommt auch wunderbares JSON raus
1: { "whois-resources" : { "link" : { "xlink:href" :
"http://apps.db.ripe.net/whois/lookup/ripe/inetnum/188.194.160.76",
2: "xlink:type" : "locator"
3: },
4: "objects" : { "object" : { "attributes" : { "attribute" : [ { "name" : "inetnum",
5: "value" : "188.194.0.0 - 188.195.255.255"
6: },
7: { "name" : "netname",
8: "value" : "KABEL-DEUTSCHLAND-CUSTOMER-SERVICES-21"
9: },
10: { "name" : "descr",
11: "value" : "Kabel Deutschland Breitband Customer 21"
Tja wie parst man das jetzt?
Schritt 1: erzeuge Klassen (für alle die pro Codezeile bezahlt werden das Ultimative Tool) mit Paste Json as classes aus den Webtools 2012.2 indem man das Json in der Zwischenablage hält.
Schritt 2: so Namen mit “–” drin gehen gar nicht. Deswegen muss man per Attribute die Zuordnung zwischen Json Attribut und .net property fallweise glattbügeln. In Zeile 30 steht im Original ein attribute(), daran verschluckt sich der Parser, deswegen brav eine generische Liste daraus gemacht.
1: Public Class Rootobject
2: <JsonProperty("whois-resources")>
3: Public Property whoisresources As WhoisResources
4: End Class
5:
6: Public Class WhoisResources
7: Public Property service As String
8: Public Property xsinoNamespaceSchemaLocation As String
9: Public Property link As Link
10: Public Property objects As Objects
11: End Class
12:
13: Public Class Link
14: Public Property xlinktype As String
15: Public Property xlinkhref As String
16: End Class
17:
18: Public Class Objects
19: <JsonProperty("object")>
20: Public Property _object As _Object
21: End Class
22:
23: Public Class _Object
24: Public Property type As String
25: Public Property link As Link1
26: Public Property source As Source
27: <JsonProperty("primary-key")>
28: Public Property primarykey As PrimaryKey
29: Public Property attributes As Attributes
30: Public Property attribute As List(Of Attribute)
31: End Class
32:
33: Public Class Link1
34: Public Property xlinktype As String
35: Public Property xlinkhref As String
36: End Class
37:
38: Public Class Source
39: Public Property id As String
40: End Class
41:
42:
43: Public Class Attribute
44: Public Property name As String
45: Public Property value As String
46: End Class
47:
48: Public Class Attributes
49: Public Property attribute As List(Of Attribute1)
50: End Class
51:
52: Public Class Attribute1
53: Public Property name As String
54: Public Property value As String
55: Public Property referencedtype As String
56: Public Property link As Link2
57: End Class
58:
59: Public Class Link2
60: Public Property xlinktype As String
61: Public Property xlinkhref As String
62: End Class
63: Public Class PrimaryKey
64: Public Property attribute As Attribute
65: End Class
Und jetzt kommt das geilste (außer sie werden für Codezeilen bezahlt)
1: Dim j = JsonConvert.DeserializeObject(Of Rootobject)(r)
Im Debugger kann man sich am Ergebnis kaum sattsehen
Und mit diesem Wissen kann man auch ganz leicht auf einzelne Eigenschaft zugreifen, wie hier per Whois, den Eigentümer einer IP Adresse
1: j.whoisresources.objects._object.attributes.attribute.Where(Function(x) x.name =
"netname").FirstOrDefault.value.ToString()
2:
Und das Beste zum Schluss, es hat Spaß gemacht.