A fájlkezelés kapcsán beszéltünk XML és Bináris Serialization megoldásokról, de a harmadik elterjedt objektum leÃró formátumról a JSON-rÅ‘l eddig nem.
Ennek oka az, hogy a .NET keretrendszer (.NET Framework) nem rendelkezik JSON támogatással beépÃtetten, ezért JSON Ãrásra és olvasásra szinte minden projekt a Newtonsoft.Json (https://www.newtonsoft.com/json) könyvtárat alkalmazza, amelyet a legkönnyebb NuGet segÃtségével beszerezni.
A .NET rendelkezik beépÃtetten JSON támogatással és a Newtonsoft.Json is támogatja a modern .NET platformokat, azonban, ha .NET-re fejlesztünk és nem régi .NET Framework-re, akkor érdemes a beépÃtett System.Text.Json névtérben található megoldásokat alkalmazni.
Ennek ellenére mégis a Newtonsoft megoldásról beszélnék elÅ‘ször, mivel a mai napig rengeteg kód épÃt erre.
A JSON mozaikszó a JavaScript Object Notation szavakból képzett rövidÃtés és egy olyan formátumot takar, ami emberi szemmel is könnyen olvasható, mint az XML. Azonban közvetlenül, átalakÃtás nélkül feldolgozható JavaScript kódból, mivel a JSON fájlok lényegében JavaScript objektumokat Ãrnak le. Ennek ellenére a formátum platformfüggetlen, mivel minden programozási nyelvhez van implementációja.
ElÅ‘nye az XML formátumhoz képest az, hogy kisebb méretű fájlt kapunk egy objektum JSON alapú tárolásakor, mint amikor XML-be Ãrjuk, valamint a web és a JavaScript miatt webes alkalmazásokban az ilyen fájlok közvetlenül, vagy könnyebben kezelhetÅ‘ek, mint az XML.
A Newtonsoft.JSON alkalmazására egy példa:
using Newtonsoft.Json;
using System;
namespace PeldaJson
{
public class Osztaly
{
public int Egesz { get; set; }
public double Tort { get; set; }
public override string ToString()
{
return $"Egesz: {Egesz}, Tort: {Tort}";
}
}
class Program
{
static void Main(string[] args)
{
Osztaly kiirando = new Osztaly
{
Egesz = 42,
Tort = 3.1415
};
string json = JsonConvert.SerializeObject(kiirando, Formatting.Indented);
Console.WriteLine("Json:");
Console.WriteLine(json);
Osztaly vissza = JsonConvert.DeserializeObject<Osztaly>(json);
Console.WriteLine(vissza);
Console.ReadKey();
}
}
}
A program kimenete:
Json:
{
"Egesz": 42,
"Tort": 3.1415
}
Egesz: 42, Tort: 3,1415
Ennek a JSON könyvtárnak az elÅ‘nye az, hogy kiÃrásra szánt osztályokat nem kell megjelölnünk semmi attribútummal.
Eltérés a beépÃtett Serialization megoldásoktól, hogy a Newtonsoft könyvtár nem közvetlenül Stream tÃpusokkal dolgozik, hanem a JSON formátumot szövegesen kezeli.
A kiÃrást és a beolvasást a JsonConvert statikus osztály segÃtségével tudjuk elvégezni. Ennek két fontos metódusa van:
string SerializeObject(object value);
string SerializeObject(object value, Formatting formatting);
Objektum kiÃrása JSON formátumba. Az egy paraméteres változat úgynevezett tömör JSON fájlt hoz létre, ami nem tartalmaz emberi olvashatóságot segÃtÅ‘ formázásokat. A kétparaméteres változatában a Formatting enum értékeivel befolyásolni lehet a formázást. Ez lehet Formatting.None vagy Formatting.Indented. Utóbbi kiválasztása esetén a JSON fájl szép, kódhoz hasonló behúzásokat és formázást kap.
T DeserializeObject<T>(string value);
JSON formátumból C# objektum készÃtése. A paraméter a JSON szöveget adja meg, a T tÃpus helyére pedig a JSON tÃpusból létrehozni kÃvánt C# osztály neve Ãrandó.
Osztály készÃtése JSON formátumból
A Visual Studio az XML-hez hasonlóan JSON struktúrából is tud C# osztályokat generálni. Ha JSON szövegből szeretnénk osztályokat generálni, akkor az Edit menün belül található Paste Special menüpont alatt válasszuk a Paste JSON as Classes opciót.
AlternatÃv módon alkalmazhatjuk a http://json2csharp.com/ oldalon található eszközt is erre a célra.
JSON tulajdonság nevek
A C# objektumok esetén a tulajdonságokat Pascal nevezéktan szerint szokás Ãrni, pl: EzEgyPelda, mÃg a Java és Javascript világ inkább a tevepúpos neveket preferálja. Ez elÅ‘zÅ‘ példa JavaScript tevepúpozásban: ezEgyPelda. Amennyiben az objektumainkban nem szeretnénk ezt a nevezéktant követni1, de nincs ráhatásunk a JSON előállÃtóra, akkor sem kell kétségbeesnünk, mivel a .NET szerializálója esetén a JsonPropertyName attribútummal, Newtonsoft esetén pedig a JsonProperty attribútummal megadhatjuk, hogy milyen tulajdonságnevet szeretnénk alkalmazni szereializáció és deszerializáció közben.
Az elÅ‘zÅ‘ példákban használt osztályunk Ãgy nézne ki megfelelÅ‘en annotálva:
using System.Text.Json.Serialization; //.net json
using Newtonsoft.Json; //newtonsoft
public class Osztaly
{
[JsonPropertyName("egesz")] //.net Json
[JsonProperty("egesz")] //newtonsoft
public int Egesz { get; set; }
[JsonPropertyName("tort")] //.net Json
[JsonProperty("tort")] //newtonsoft
public double Tort { get; set; }
public override string ToString()
{
return $"Egesz: {Egesz}, Tort: {Tort}";
}
}
Megjegyzés: Hasonló módon NEM érdemes keverni a JSON szerializálási lehetőséget. Érdemes egyfajta szerializáló mellett letenni a voksot.
-
Nem érdemes eltérni, mivel egyrészt rontja a kód olvashatóságát, másrészrÅ‘l pedig szembe megy a hivatalosan ajánlott nevezéktannal, amiért a legtöbb kód elemzÅ‘ eszköz (többek között a Visual Studio beépÃtettje is) panaszkodni fog.↩