Json Parsing mit .net

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.

image

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

image

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.

Kommentare sind geschlossen