Linq – language integrated query, to w dużym uproszczeniu możliwość definiowania zapytań podobnych do SQLa dla różnych Ľródeł danych. Domyślnie Linq wspiera XML (XLinq) oraz bazy danych (LinqToSql).
Ostatnio powstaje bardzo dużo rozszerzeń do Linq. Jedno z nich zwróciło moją szczególną uwagę: JsonToLinq. Javascript Object Notation jest formatem, w którym można zserializować obiekty JavaScriptowe i póĽniej je szybko zdeserializować. Czytałem (niestety w tej chwili nie pamiętam Ľródła), że JSON jest wielokrotnie szybszy niż parsowanie XML przy AJAXowych wywołaniach.
Przykładowo JSON może wyglądać tak:
{
'id': 2,
'login': 'wiesiek',
'background_path': '/users/sztywny/background',
'avatar_path': '/users/sztywny/avatar',
'current_status_path': '/statuses/12345'
}
Biblioteka JSON.NET implementuje odpowiednie ( i co najważniejsze szybkie)readery dla jsona, przez co można skorzystać z wszystkich możliwości jakie daje Linq. Dla powyższego przykładu JSONa, odczytujący go kod może wyglądać tak:
1 user.Id = jsonResponse.PropertyValue<int>(“id”);
2 user.Name = jsonResponse.PropertyValue<string>(“login”);
3 user.ScreenName = jsonResponse.PropertyValue<string>(“login”);
Jednak prawdziwe możliwości ujawnia przy przetwarzaniu bardziej złożonych struktur:
[{
"type":"DirectedMessage",
"body":"aaaa",
"transport":{"name":"www","id":6},
"id":2424062,
"user_path":"/users/xxx",
"recipient_path":"/users/yyyy",
"created_at":"2008-06-25 20:02:32"
},{
"type":"Status",
"body":"zzzzzzz",
"transport":{"name":"api","id":7},
"id":2424061,
"user_path":"/users/rrrr",
"created_at":"2008-06-25 20:02:10"
}]
Żeby z takiej reprezentacji stworzyć strukturę obiektów można zrobić coś takiego:
1 JArray jsonResponse = JArray.Load(new JsonReader(reader));
2 if (jsonResponse != null)
3 {
4 var _tweets = from o in jsonResponse.Children<JObject>()
5 select new Tweet()
6 {
7 DateCreated = o.PropertyValue<DateTime>(“created_at”),
8 Id = o.PropertyValue<long>(“id”),
9 Text = o.PropertyValue<string>(“body”),
10 User = GetUser(ApiUrl + o.PropertyValue<string>(“user_path”))
11 };
12 }
A piszę o tym dlatego, że zacząłem bawić się API do BLIPa, które wszystkie wyniki zwraca właśnie w formacie JSON.
To co próbuje zrobić to dostosować fajnego klienta Twitter(protoplasty blipa) w wpf do współpracy z naszym rodzimym serwisem. Udało mi się już zalogować do serwisu i pobrać ostatnie wiadomości, jednak jak na razie przy większej liczbie żądań pojawia się błąd 🙁 wydaje mi się, że jest to bolączka tego rozwiązań.

Oryginalny klient Twittera nazywa się Witty i ma całkiem ciekawy kod 🙂