Minule jsme si ukázali získávání dat z webu. Ukazovali jsme si to ale na datech ve velmi jednoduchém formátu, kdy jsme měli číslo a to bylo obsahem celé stránky. Většinou se ale na jedné stránce posílá více dat. Aby se od sebe dali odlišit, jsou v nějakém strojově čitelném formátu, ve většině případech v JSON.
Můžeme si to ukázat například zde: http://worldtimeapi.org/api/timezone/Europe/Prague, kde tato stránka nám ukazuje informace o aktuálním čase v Praze. Pro lepší zobrazení doporučuji otevírat tuto stránku v prohlížeči Firefox, který ta data zobrazí v tabulce. Taková data jsou ve formátu následujícím:
{ "abbreviation": "CET", "client_ip": "203.0.113.15", "datetime": "2023-11-20T10:29:45.013543+01:00", "day_of_week": 1, "day_of_year": 324, "dst": false, "dst_from": null, "dst_offset": 0, "dst_until": null, "raw_offset": 3600, "timezone": "Europe/Prague", "unixtime": 1700472585, "utc_datetime": "2023-11-20T09:29:45.013543+00:00", "utc_offset": "+01:00", "week_number": 47 }
Aby jsme taková data mohli zpracovat, potřebujeme si dostáhnout knihovnu Newtonsoft.Json
. Tuto
knihovnu stáhneme následujícím způsobem:
Na pravé liště klikneme pravým tlačítkem na název náš projekt.
V zobrazeném menu klikneme na Spracovat balíčky NuGet...
.
V menu, co se nám otevřelo, klikneme na Procházet
a do vyhledáváciho pole napíšeme
Newtonsoft.Json
. Po té až se nám najde, tak na něj klikneme levým tlačítem.
Po té klikneme na tlačítko Nainstalovat
.
Zde můžete vidět kód, který tuto knihovnu využívá.
using System; using System.Net.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; class Program { static void Main() { // poskládání URL adresy string city = "Prague"; string APIUrl = $"http://worldtimeapi.org/api/timezone/Europe/{city}"; // získání dat z API HttpClient client = new HttpClient(); string response = client.GetStringAsync(APIUrl).Result; // rozložení JSON na proměnné JObject jsonObj = JsonConvert.DeserializeObject<JObject>(response); int dayOfYear = jsonObj["day_of_year"].Value<int>(); string timezone = jsonObj["abbreviation"].Value<string>(); // vypsání dat Console.WriteLine($"Dnes je {dayOfYear}. den v roce."); Console.WriteLine($"Praha je v časovém pásmu {timezone}."); Console.ReadLine(); } }
Tento kód nám vypíše následující výstup:
Dnes je 324. den v roce. Praha je v časovém pásmu CET.
Všimněte si, že v kódu máme město jako samostatnou proměnnou. Díky tomu můžeme změnit město na jiné jen pomocí změny proměnné, pokud se nachází v Evropě. Zde je menší vysvětlení dalšího kódu:
JObject jsonObj = JsonConvert.DeserializeObject<JObject>(response);
načte výstup v proměnné response
a rozdělí si ho na objekty.
int dayOfYear = jsonObj["day_of_year"].Value<int>();
si z výstupu uloženém v jsonObj
vyndá text označený day_of_year
a uloží si ho jako int
.
string timezone = jsonObj["abbreviation"].Value<string>();
si z výstupu uloženém v jsonObj
vyndá text označený dabbreviation
a uloží si ho jako string
.
Udělejte kód, který uživateli ukáže jeho IP adresu a časové pásmo města Sofia
.
using System; using System.Net.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; class Program { static void Main() { // poskládání URL adresy string city = "Sofia"; string APIUrl = $"http://worldtimeapi.org/api/timezone/Europe/{city}"; // získání dat z API HttpClient client = new HttpClient(); string response = client.GetStringAsync(APIUrl).Result; // rozložení JSON na proměnné JObject jsonObj = JsonConvert.DeserializeObject<JObject>(response); string userIP = jsonObj["client_ip"].Value<string>(); string timezone = jsonObj["abbreviation"].Value<string>(); // vypsání dat Console.WriteLine($"Vaše IP adresa je {userIP}"); Console.WriteLine($"Sofia je v časovém pásmu {timezone}."); Console.ReadLine(); } }
Udělejté kód, který uživateli ukáže časové pásmo jím zvoleného Evropského hlavního města. Seznam měst je zde: https://worldtimeapi.org/api/timezone/Europe/
using System; using System.Net.Http; using Newtonsoft.Json; using Newtonsoft.Json.Linq; class Program { static void Main() { // poskládání URL adresy Console.Write("Zadejte Evropské hlavní město: "); string city = Console.ReadLine(); string APIUrl = $"http://worldtimeapi.org/api/timezone/Europe/{city}"; // získání dat z API HttpClient client = new HttpClient(); string response = client.GetStringAsync(APIUrl).Result; // rozložení JSON na proměnné JObject jsonObj = JsonConvert.DeserializeObject<JObject>(response); string timezone = jsonObj["abbreviation"].Value<string>(); // vypsání dat Console.WriteLine($"{city} je v časovém pásmu {timezone}."); Console.ReadLine(); } }