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 ugyan rendelkezik JSON írási és olvasási lehetőségekkel, de a beépített megoldás igencsak limitált. Éppen 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 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.↩