JSON Objelerini C# dilinde Class ve Listlere Dönüştürme

Tüm yazılımcı dostlarıma selamlar. Bu gün günlük hayatta XML yapıları sonrasında gelişen haberleşme teknolojileri arasında bulunan JSON Objelerinin nasıl c# dilinde kullanılacağını göstereceğiz. Bu yazıya başlamadan önce dilerseniz JSON nedir bundan bahsedelim

JSON (JavaScript Object Notation), basit veri yapılarını temsil etmek için tasarlanmış bağımsız bir veri değişim formatıdır. Esas olarak iki sistem arasındaki veri alışverişi için kullanılır. Örneğin JSON kullanarak sunucu ile web uygulaması arasında veri aktarabilirsiniz. JSON Dosyalarını genellikle birden fazla yazılım dilinde kullanabilir. Gelelim c# dilinde bu JSON dosyalarını nasıl kullabileceğimize…

Herhangi bir sayfaya HTTP Post isteği yaptığımızda genellikle bu aşağıdaki gibi geri dönüş alırız

 

{
"status": true,
"version": "2.0.3",
"expires": "1551829009.0"
}

Bu tipte karşımıza çıkan basit bir Post Requestinde aşağıdaki gibi bir class hazırlamamız ilk planda işimizi görecektir.

public class DataRequest
{
   public bool Status {get;set;}
   public string Version {get;set;}
   public TimeSpan Expires {get;set;}
}

Hazırlamış olduğumuz bu classı dolduracak metoda geçmeden önce bazı durumlarda json property içerisine bizlere aşağıdaki gibi “_” veya boşluk içeren bilgiler de gelebilir. "status_code" kısmında olduğu gibi

{
"status": true,
"version": "2.0.3",
"status_code": 200,
"expires": "1551829009.0"
}

Bu tip durumlar için clasımızın üst kısmına “JsonProperty” açarak istediğimiz isimde nitelendirebiliriz. Aynı classımız üzerinden Örnek vermek gerekirse

public class DataRequest
{
public bool Status {get;set;}
public string Version {get;set;}
[JsonProperty("status_code")]
public int StatusCode {get;set;}
public TimeSpan Expires {get;set;}
}

Bu yapıdaki örnekleri çoğaltabiliriz. Burada önemli olan nokta kodun nasıl işlediğini kavramaktır. Şimdi işleri biraz daha ileriye taşıma zamanı. Örneğimiz üzerinden hareketle gelen JSON dosyası içerisine bir alt kısım daha oluşturalım

{
"status": true,
"version": "2.0.3",
"status_code": 200,
"expires": "1551829009.0",
"players":
   {
      "k_yigit": {
            "seasonal_role": "admin",
             "fullname": "Kaan YİĞİT",
             "name": "Kaan"
             },
      "m_beyaz": {
            "seasonal_role": "admin",
            "fullname": "Mustafa BEYAZ",
            "name": "Mustafa"
             },

      }
}

Yeni yapımızda karşımıza “players” isminde bir property çıkarak oyuncuların bilgilerini de bizlere ileten LİSTE olduğu gözlemlenmektedir. Bu tip durumlar için Oyunculara özel bir class üretmemiz gerekecektir.

public class Player
{
public string Id { get; set; }
[JsonProperty("seasonal_role")]
public string SeasonalRole { get; set; }
public string Fullname { get; set; }
public string Name { get; set; }
}

Üretilen bu yeni player classımız birden fazla öğe barındıracağından dolayı “DataRequest” isimli classımızda List şeklinde tanımlama yapacağız.

public class DataRequest
{
public bool Status {get;set;}
public string Version {get;set;}
[JsonProperty("status_code")]
public int StatusCode {get;set;}
public TimeSpan Expires {get;set;}
public List<Player> Player {get;set;}
}

Bu aşamadan sonra yapmanız gereken tek şey class’ımıza json dosyasını göndermektir. Bu aşamada ise örnek kod

string jsonArray = "Gönderilecek JSON Dosyası yada adresi";

var DataRequestList= JsonConvert.DeserializeObject<List<DataRequest>>(jsonArray);

Newtonsoft Json ile çok daha pratik ve az maliyetli bir çözüm üretmek isterseniz aşağıdaki kod bloğunu inceleyebilirsiniz.

public class PlayersConverter : JsonConverter
{
 // Bu metod ile Json Dosyasına istediğiniz türde veriler yazabilirsiniz
 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
    writer.WriteStartArray();
    foreach (var player in (List) value)
    {
      writer.WriteRawValue(JsonConvert.SerializeObject(player));
    }
    writer.WriteEndArray();
  }

// Bu metod ile JSON dosyası okuması yapabilirsiniz.
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var response = new List();
// Loading the JSON object
JObject players = JObject.Load(reader);
// Looping through all the properties. C# treats it as key value pair
foreach (var player in players)
{
// Finally I'm deserializing the value into an actual Player object
var p = JsonConvert.DeserializeObject(player.Value.ToString());
// Also using the key as the player Id
p.Id = player.Key;
response.Add(p);
}

return response;
}

public override bool CanConvert(Type objectType) => objectType == typeof(List);
}
 

Bu oluşturduğunuz metodu ise “typeof” kullanımı ile direk classımıza aktarabilirsiniz. Bunun için clasımızın son hali ise aşağıdaki gibi olacaktır.

public class DataRequest
{
public bool Status {get;set;}
public string Version {get;set;}
[JsonProperty("status_code")]
public int StatusCode {get;set;}
public TimeSpan Expires {get;set;}
[JsonConverter(typeof(PlayersConverter))]
public List Player {get;set;}
}

JSON Dosyalarınızı nasıl classlayabileceğinize tam olarak emin olmadıysanız yada başka örnekler de kullanmak isterseniz json2csharp.com benzeri online uygulamalardan da faydalanabilirsiniz