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.
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>