27.06.2022, Vladimír Klaus, navštíveno 1207x

ASP.NET/C#

Tento článek ale vznikl především jako malá sada praktických ukázek. Tedy přesně to, co v naprosté většině případů chybí v MS dokumentaci, ale i na řadě webů nejsou některé věci řádně vysvětleny (nebo naopak příliš složitě). Stranou ale nezůstane ani pěkné formátování a pohodlná práce s JSON.

Formátování a vzhled JSON

První věcí, kterou bych zmínil je používání Visual Studio Code pro práci s JSON. S tímto formátem si skvěle poradí - umí ho pěkně formátovat, samozřejmě podporuje barevnou syntaxi, ukazuje problémy (nekorespondující závorky apod. a velmi vhodné je též zabalení/rozbalení "uzlů" - i když toto je řešeno poněkud nešťastně (skrytě). Musíte nejprve najet myší do levé části (kde jsou čísla řádek) a teprve poté zjistíte, že jdou úrovně zabalovat.

Ukázkový JSON ve Visual Studio Code:

Jak pracovat s JSON v C#, Visual Studiu (Code), obr. 1

Ukázkový JSON v editovatelné podobě:

{
    "kind": "youtube#videoListResponse",
    "etag": "xzMSf6pGB0bgCgMt78SY4EDN5iU",
    "items": [
        {
            "kind": "youtube#video",
            "etag": "F3Dspt1tiAYcfDaWKKPEN84gEVc",
            "id": "iBzthH4bGMU",
            "snippet": {
                "publishedAt": "2012-02-19T19:00:49Z",
                "channelId": "UCKjdAjkkXb-s007HjdzfcVA",
                "title": "Six rules of a success - Arnold Schwarzenegger",
                "thumbnails": {
                    "default": {
                        "url": "https:\/\/i.ytimg.com\/vi\/iBzthH4bGMU\/default.jpg",
                        "width": 120,
                        "height": 90
                    },
                    "maxres": {
                        "url": "https:\/\/i.ytimg.com\/vi\/iBzthH4bGMU\/maxresdefault.jpg",
                        "width": 1280,
                        "height": 720
                    }
                },
                "channelTitle": "Nutrimax.cz",
                "tags": [
                    "Arnold Schwarzenegger",
                    "motivační řeč"
                ]
            },
            "status": {
                "uploadStatus": "processed",
                "madeForKids": false
            }
        }
    ],
    "pageInfo": {
        "totalResults": 1,
        "resultsPerPage": 1
    }
}

Jak JSON pěkně naformátovat

Zde to bude velmi jednoduché - na začátku mám nějaký JSON string, který nemusí pěkně vypadat, takže si z něj uděláme objekt a ten následně převedeme zase na text, ale s použitím formátování.

using Newtonsoft.Json;

public static string PrettyJson(string aJSONText) {
    var obj = JsonConvert.DeserializeObject(aJSONText);
    string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
    return json;
}

Pochopitelně zde může být ještě jedna drobnost, která může potrápit - zobrazení na webu. Získaný text totiž používá jako oddělovač řádek normální "Entery", což se v HTML ignoruje. Naštěstí je zde elegantní řešení, tedy získaný text obalit tagem <pre>. V něm se Entery, ale i třeba obyčejné mezery "zachovají".

<pre>
"pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
}
</pre>

Výsledek pak v HTML vypadá takto:

"pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
}

Jak z JSON jednoduše dostat údaje

Toto je dle mého nejdůležitější a na to se také každý ptá. Přičemž návodů, metod, pomocných tříd je nepočítaně. Přitom řada z nás toto potřebuje jen občas a hlavně jednoduše.

V následujícím příkladu provedeme opět převod JSON stringu na objekt, ale tentokráte do sofisitkovanější podoby - JObject. To nám následně umožní pomocí tečkové notace (i když pochopitelně bez nabízení možných vlastností) se dostat k datům.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

bool AnalyzujJSON(string aJSON) {
    var data = (JObject)JsonConvert.DeserializeObject(aJSON);
    //přímo v rootu je etag a chceme ji jako string
    string tag = data.Value<string>("etag");
    //tato hodnota je již zanořená a chceme ji jako integer
    int pocet = data["pageInfo"].Value<int>("totalResults");
    //tady mám pole "items" a z prvího prvku potřebujete stringový údaj kind
    string kind = data["items"][0].Value<string>("kind");

    //další možnosti u "vícenásobného" přístupu 
    string x = array[0].Value<JObject>("status").Value<string>("privacyStatus");
    string y = (string)data["items"][0]["status"]["privacyStatus"];
}

U těch polí se vyplatí nejdříve získat odkaz na celé pole a pak je zápis přeci jen o trochu přehlednější.

JArray array = (JArray)data["items"];
string kind = array[0].Value<string>("kind");

Výše uvedené se dá ještě zjednodušit:

JObject data = JObject.Parse(aJSON);
string kind = (string)data["items"][0]["kind"];

Velkou nepříjemností je situace, kdy nějaký odkazovaný element nebo prvek pole neexistuje. Tedy může zaznít jediné doporučení - neustále a všude testujte na existenci daného elementu a také na hodnotu elementu. Obojí může být null! Nebo si na to napište funkci, v každém případě je to nezbytné, jinak vám bude aplikace na každém druhém JSONu padat!

Jak pracovat s JSON v C#, Visual Studiu (Code), obr. 2

Ještě další variantou je pokus o deserializaci JSON textu přímo do konkrétního objektu/třídy. To už je ale trochu jiné téma a na jiný článek. Zatím můžete juknout na jeden z níže uvedených odkazů, který tuto situaci vysvětluje.

Zdroje: