Twitter Search API mit Silverlight befragen

Im Zuge der Österreichischen Sharepoint Konferenz, die wir von ppedv im Auftrag von Microsoft veranstaltet haben, habe ich eine Twitterwall geschrieben. Twitter besitzt drei API’s wovon die Search API die einfachste ist. Im folgenden Beispiel suchen wir alle Tweets mit dem Hashtag Silverlight.

http://search.twitter.com/search?q=%23silverlight

Um die Daten im Atom Format zu bekommen muss die Syntax leicht verändert werden mit dem ATOM Zusatz

http://search.twitter.com/search.atom?q=%23silverlight

Atom ist ein XML Format und entsprechend schwergewichtig. Wesentlich schlanker ist Json. Mit folgender Query erhält man diese Daten als JSon.

http://search.twitter.com/search.json?q=%23silverlight

Dabei reduziert sich der Traffic auf ein Drittel. Auch das Parsen müsste deutlich schneller sein. Aktuell habe  ich aber keine Performance Messungen vorgenommen.

Nun laden wir diese Daten in einer Silverlight Anwendung mit einem WebClient.

Private Sub Button1_Click(ByVal sender As System.Object, 
ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click Dim wc As New WebClient AddHandler wc.DownloadStringCompleted, AddressOf fertig wc.DownloadStringAsync(New
Uri("http://search.twitter.com/search.json?q=%23silverlight&lang=all&rpp=5", UriKind.Absolute)) End Sub

In der asynchronen Methode Fertig werden dann die Daten bearbeitet. Da gibt es in Silverlight (und nur dort) eine nettes Assembly System.Json. Per JSonObject wird die Zeichenkette geladen und dann alle “Results” Elemente/Objekte in ein JsconArray gepackt. Per Linq könnte man dann noch filtern, was in diesem Beispiel nach der From Anweisung per Where codiert würde. Dann werden die Items dem Datagrid zugewiesen.

Private Sub fertig(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        Dim js As JsonArray
        Dim jo As JsonObject
        jo = JsonObject.Parse(e.Result)
        js = jo("results")
        Dim items = From x In js
                      Select x
        DataGrid1.ItemsSource = items
 End Sub

Um die deklarative Bindung durchzuführen muss man noch ein wenig in die Objekte reinsehen. Items ist ein Dictionary von JsonObject. Ein JsonObject wiederum ist eine unsortierte Collection von Key Value Paaren. Durch Twitter Json stehen da elf Werte drin über die der Debugger Auskunft gibt.

image

Neben ID ist das wichtigste der eigentliche Text. Entsprechend die Bindung in XAML per IndexBinding an den Key “text”.

<sdk:DataGrid AutoGenerateColumns="False" Height="217" 
HorizontalAlignment="Left" Margin="12,37,0,0" Name="DataGrid1"
VerticalAlignment="Top" Width="379" > <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Binding="{Binding Path=[text]}">
</sdk:DataGridTextColumn> </sdk:DataGrid.Columns> </sdk:DataGrid>

 

 

 

Kommentar schreiben