27.06.2022, Vladimír Klaus, navštíveno 1207x
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:
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!
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:
- https://stackoverflow.com/questions/41752928/c-sharp-get-value-from-deserialized-json-object
- https://stackoverflow.com/questions/15184430/jobject-how-to-read-values-in-the-array
- https://stackoverflow.com/questions/11126242/using-jsonconvert-deserializeobject-to-deserialize-json-to-a-c-sharp-poco-class
- Připomínám ještě článek na podobné téma - Jak v Delphi pracovat s JSON.