Artykuł

cze 03 2010
0

Json.NET - opis biblioteki

JSON jest lekkim i uniwersalnym format przesyłania danych. Pozwala on przekazywać informacje w szybki i sprawny sposób np. pomiędzy elementami strony WWW. Na tym blogu, pisałem już o nim wielokrotnie. Ostatnio np. we wpisach: Ajax, XML i JSON w jQuery i Widget Twitter w PHP i jQuery na stronie. W tych właśnie wpisach, ukazałem JSONa głównie pod kątem użycia w JavaScripcie. Dziś, mam zamiar pokazać jego użycie w środowisku .NET wykorzystując do tego język C#.

Format łańcucha JSON

Łańcuchy JSON, tworzone są bardzo w prosty sposób poprzez zadeklarowanie odpowiednich par kluczy i wartości. Każdy klucz, powinien być wzięty w cudzysłów, tak samo wartości tekstowe. Oprócz tego, wartością może być liczba, lub tablica. Przykładowy łańcuch JSON może wyglądać tak:

{"errorcode": 0, "errordesc": "opis błędu"}

Szerzej na temat formatu JSON pisałem we wpisie Ajax, XML i JSON w jQuery, dlatego nie będę powtarzał teraz tutaj tych informacji.

Biblioteka Json.NET

Niestety, ale JSON został potraktowany przez programistów frameworka .NET po macoczesmu (W wersji frameworka 3.5, pojawiła się klasa JavaScriptSerializer, jednak jej funkcjonalność pozostawia wiele do życzenia), dlatego warto skorzystać z innej, zewnętrznej biblioteki. Ponieważ w ostatnim czasie sam interesowałem się tym tematem, znalazłem fajną bibliotekę Json.NET, która dostępna jest za darmo.

Do najważniejszych cech tej biblioteki należy zaliczyć m.in.:

  • Obsługę JSONa przy pomocy LINQ
  • Klasa JsonSerializer szybko konwertuje obiekty .NET do JSONa i z powrotem
  • Możliwość konwersji JSONa do XMLa
  • Wsparcie wielu platform: .NET, Silverlight i Compact Framework

Podłączanie biblioteki

Przed przystąpieniem do pracy, powinniśmy umieścić odpowiedni plik DLL (o doborze odpowiedniego pliku należy przeczytać w załączonym do biblioteki pliku Readme) w katalogu projektu. Biblioteki powinno umieszczać się w katalogu bin/release (jednak nie jest to jakaś żelazna reguła).

Następnie, dla konkretnego projektu, należy dodać referencję (screen 1) do biblioteki, którą przed chwilą skopiowaliśmy (należy wskazać ręcznie odpowiedni plik DLL). Po tej operacji, będziemy mogli korzystać z klas biblioteki poprzez dodanie odpowiedniego usinga.

Budowanie łańcucha JSON

Załóżmy, że chcemy wysłać z poziomu kodu C# (który jest CodeBehind w stronie ASP.NET) odpowiedź do JavaScriptu właśnie JSONem. Zasadniczo możemy to zrobić na kilka sposobów. Jeśli dane są proste, to moglibyśmy to zrobić nawet bez wykorzystanie biblioteki np. w taki sposób:

int nErrorCode = 1;
string sErrorDesc = "Błąd bazy danych";
Response.ContentType = "application/json"
Response.Write("{\"errorcode\": \"" + nErrorCode + "\", \"errordesc\": \"" + sErrorDesc + "\"}");

Jednak nie jest do końca eleganckie i wygodne rozwiązanie. Dużo ciekawszym pomysłem było np. zserializowanie całego obiektu. Stwórzmy zatem klasę Person, która będzie przekonywała imię, nazwisko, wiek oraz tablicę ulubionych kolorów. A zatem wykorzystamy w tym przypadku łańcuchy tekstowe, liczbę oraz tablicę - w sam raz by ukazać możliwości JSONa. Oto kod klasy:

public class Person
{
    public Person(string sName, string sSurname, int nAge, string[] asFavouriteColours)
    {
        Name = sName;
        Surname = sSurname;
        Age = nAge;
        FavouriteColours = asFavouriteColours;
    }

    public string Name 
    { 
        get; 
        private set; 
    }

    public string Surname
    {
        get;
        private set; 
    }

    public int Age
    {
        get;
        private set;
    }

    public string[] FavouriteColours
    {
        get;
        private set;
    }

}

Przy pomocy biblioteki, zseralizowanie obiektu tej klasy, jest dziecinnie proste. Najpierw dodajemy odpowiedni using:

using Newtonsoft.Json;

Następnie, już wewnątrz naszej klasy, tworzymy nowy obiekt klasy Person serializujemy go i wysyłamy do JavaScriptu:

Person oPerson = new Person("Jan", "Kowalski", 25, new string[] { "Niebieski", "Żółty", "Zielony" });
Response.ContentType = "application/json"
Response.Write(JsonConvert.SerializeObject(oPerson));

Całość zajęła tylko trzy linijki! A efekt? Pięknie sformatowany łańcuch JSON:)

Parsowanie JSONa

Nauczyliśmy się jak budować JSONa w .NET, ale teraz nauczymy się czynności odwrotnej, czyli rozkładania łańcucha JSON na elementy. Dla odmiany nie będziemy deserializować łańcucha do postaci obiektu, ale zrobimy coś równie ciekawego.

Pod adresem http://www.deanclatworthy.com/imdb/, znajduje się WebService, który umożliwia pozyskiwanie danych z bardzo popularnej bazy filmowej Imdb. (WebService ma ograniczenie do 30 wywołań w przeciągu godziny dla użytkownika). Szczegóły działania można znaleźć pod wymienionym wyżej adresem. Najważniejszą jednak informacją dla nas jest to, że WebService zwraca dane w postaci JSONa. Aby je sparsować, wykorzystamy funkcjonalność LINQ to JSON.

Przystępujemy zatem do pisania. Najpierw należy dodać odpowiedniego usinga:

using Newtonsoft.Json.Linq;

Dalej, możemy już umieścić nasz kod wewnątrz klasy:

HttpWebResponse oHttpWebResponse = null;
StreamReader oStreamReader = null;
try
{
    HttpWebRequest oHttpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.deanclatworthy.com/imdb/?q=The+Green+Mile");
    oHttpWebRequest.Method = "GET";
    oHttpWebResponse = (HttpWebResponse)oHttpWebRequest.GetResponse();
    oStreamReader = new StreamReader(oHttpWebResponse.GetResponseStream());
    JObject oObject = JObject.Parse(oStreamReader.ReadToEnd());
    Console.WriteLine("ID: " + (string)oObject["id"] +
        "\nNazwa filmu: " + (string)oObject["title"] +
        "\nOcena: " + (string)oObject["rating"]);
}
catch (Exception oException)
{
    Console.WriteLine("Błąd: " + oException.Message);
}
finally
{
    if (null != oStreamReader)
    {
        oStreamReader.Close();
    }
    if (null != oHttpWebResponse)
    {
        oHttpWebResponse.Close();
    }
}

Prześledźmy kod krok po kroku. Na początku, deklarujemy odpowiednie obiekty. Robimy to przed blokiem try, bo obojętnie co się stanie (np. jakiś błąd w kodzie) to muszą one zostać zamknięte, a operacji zamknięcia dokonujemy w klauzuli finally. Następnie rozpoczynamy sekcję try-catch-finally - dzięki czemu załatwiamy całą obsługę błędów. W dalszych wierszach, inicjalizujemy wszystkie obiekty. Wykorzystałem tutaj do uproszczenia gotowy łańcuch (można to oczywiście zrobić inaczej). Wszystko to, prowadzi do linii 9, w której pobieramy łańcuch tekstowy z odpowiedzi i tworzymy z niego obiekt klasy JObject. Ten obiekt, jest tworzony dynamicznie i zawierać będzie wszystkie zwrócone pary kluczy i wartości. Następnie w liniach 10-12, wyświetlamy kilka interesujących nas danych wybranego filmu. Dostępnych do konkretnych kluczy uzyskujemy przy pomocy kwadratowych nawiasów. Wartość powinniśmy również rzutować do odpowiedniego typu. I to wszystko. Efektem powinny być informacje o naszym ulubionym filmie:)

Podsumowanie

W dzisiejszym wpisie, przedstawiłem bardzo użyteczną bibliotekę Json.NET. Oczywiście zaprezentowałem tylko, garść z funkcjonalności tu dostępnych, ale myślę, że były to te ważniejsze z nich:). Godną uwagi funkcjonalnością, może być również możliwość konwersji JSONa do XMLa. Zachęcam do własnych eksperymentów:).

Data ostatniej modyfikacji: 05.06.2011, 17:17.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus