Zpracování dat z JSON

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.

Zadání

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();
    }
}

Příliš snadné?

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();
    }
}