Json.NET
JSON w dzisiejszych czasach niewątpliwie zasiada na tronie przesyłu danych w środowiskach webowych. To lekki, prosty, czytelny jegomość którego wielokrotnie spotkasz na drodze swojego programistycznego życia. Tematyką dzisiejszego wpisu są serializacja i deserializacja przy użyciu C#
Dla ciekawych odsyłam do definicji wprost z Wikipedii:
In computing, JavaScript Object Notation or JSON is an open-standard file format that uses human-readable text to transmit data objects consisting of attribute–value pairs and array data types (or any other serializable value). It is a very common data format used for asynchronous browser–server communication, including as a replacement for XML in some AJAX-style systems.
Jak wygląda przykładowy JSON?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{"employees": [{ "Name": "Jan", "Surname": "Kowalski", "Age": 27, "FavouriteDrinks": [ "Beer", "Vodka", "Whisky" ]}, {"Name": "Anna", "Surname": "Nowak", "Age": 35, "FavouriteDrinks": [ "Wine", "Gin", "Mohito" ]} ] } |
Całkiem czytelnie, składania jest przejrzysta a dane trzymamy przypisane do odpowiednich kluczy (np. „Name” : „Jan”). Liczby możemy podawać wprost – tak jak zrobiono to pod kluczem Age, stringi umieszczamy w cudzysłowie. W powyższym przykładzie przekazano kolekcje dwóch obiektów employees dla których posiadamy dane takie jak: Name, Surname, Age oraz tablicę FavourtieDrinks.
JSON.Net
C#, obsługa JSON’a jest o tyle prosta o ile użyjemy do tego odpowiedniej biblioteki – z czystym sumieniem mogę Ci polecić Json.NET od Newtonsoft. Więcej informacji na ten temat znajdziesz tutaj. Samo dodanie jej do projektu jest banalnie proste – zrobisz to korzystając z NuGet Packages.
Serializacja
To proces w którym konkretny obiekt serializujemy do JSON w formacie string. Na potrzeby powyższego przykładu utwórzmy sobie prosty model będący odwzorowaniem powyższego przykładowego JSONa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Employees { public Employees(Person[] person) { this.Persons = person; } [JsonProperty(PropertyName ="employees")] public Person[] Persons { get; set; } } public class Person { public Person(string name, string surname, int age, string[] favouriteDrinks) { this.Name = name; this.Surname = surname; this.Age = age; this.FavouriteDrinks = favouriteDrinks; } public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } public string[] FavouriteDrinks { get; set; } } |
Zainicjalizujmy obiekt klasy Employees
1 2 3 4 5 6 |
Employees employees = new Employees( new Person[] { new Person("Jan", "Kowalski", 27, new string[] { "Beer", "Vodka", "Whisky" }), new Person("Anna", "Nowak", 35, new string[] { "Wine", "Gin", "Mohito" }) }); |
Użycie biblioteki Json.NET i serializacji wygląda następująco
1 |
var jsonEmployee = JsonConvert.SerializeObject(employees); |
a otrzymanym rezultatem jest nasz zainicjalizowany obiekt employees w formacie JSON (poniżej przedstawiam podgląd w VS):
Deserializacja
W przypadku gdy otrzymamy odpowiedź w formacie JSON i chcemy ją dalej przetworzyć będziemy potrzebowali wykonać operację deserializacji. Aby tego dokonać w pierwszej kolejności należy utworzyć w kodzie strukturę odpowiadającą polom z JSON’a które będą nas interesować (nie musimy deserializować całego JSONa).
Im więcej JSONów będziesz mieć za sobą tym łatwiej będzie Ci to przychodzić, jeśli jednak nie do końca wiesz jak powinno wyglądać odwzorowanie mogę Ci polecić internetowy konwerter za pomocą którego skutecznie i szybko dostaniesz oczekiwanie rezultaty.
https://app.quicktype.io/
Wszystko co musisz zrobić to wkleić tam JSON i wybrać język (w naszym przypadku C#). Automatycznie wygenerowany zbiór klas wyświetli się w głównym oknie. Co ciekawe dla C# konwerter ten używa biblioteki Json.Net.
W naszym przykładzie wykorzystamy utworzone wcześniej klasy.
TIP: Atrybut [JsonProperty(PropertyName =”name”)] jest opcjonalny i daje możliwość deserializować klucze JSON do inaczej nazywających się propert w modelu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Employees { public Employees(Person[] person) { this.Persons = person; } [JsonProperty(PropertyName ="employees")] public Person[] Persons { get; set; } } public class Person { public Person(string name, string surname, int age, string[] favouriteDrinks) { this.Name = name; this.Surname = surname; this.Age = age; this.FavouriteDrinks = favouriteDrinks; } public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } public string[] FavouriteDrinks { get; set; } } |
Samą deserializacji wywołujemy intuicyjnie prosto. Posłużmy się tu wcześniej zserializowanym obiektem jsonEmployee i powróćmy tym samym do stanu wyjściowego.
1 2 |
var jsonEmployee = JsonConvert.SerializeObject(employees); var jsonDeserialize = JsonConvert.DeserializeObject<Employees>(jsonEmployee); |
Jak widzisz metoda DeserializeObject<> jest typu generycznego, w nawiasach podajemy typ na jaki ma być zdeserializowany obiekt (w naszym przypadku Employees). W ten sposób dokonaliśmy deserlializacji obiektu JSON na pełnoprawny obiekt zbudowany w opraciu o przygotwany przez nas model.
Podsumowanie
To zaledwie wierzchołek góry lodowej i garść funkcjonalności jakie oferuje nam biblioteka Json.Net. Serdezcnie zachęcam Cię do tworzenia własnych przykładów i zaprzyjeźnienia się z obsługą tego użytecznego formatu. Jak widzisz serializacja jak i deserializacja nie jest wcale taka trudna. A jeśli…
poszukujesz większej ilości ciekawych treści na pewno zainteresują Cię inne wpisy, które umieściłem na blogu. Zapraszam do pozostawienia komentarzy, czekam na Twoją opinię, uwagi i feedback.
Pozdrawiam Cię serdecznie i życzę fantastycznego dnia!
Wojtek