Unity İle Json Okuma


Merhaba arkadaşlar sizlere daha önce Unity ile JSON dosyası oluşturmayı anlatmıştım. Görmeyenler veya yeniden okumak isteyenler için Unity Json Oluşturma bağlantısına tıklayıp yazıyı okuyabilirsiniz.

JSON Dosyamız


{
  "Version": 71,
  "AppName": "QuizRun",
  "Sorular": [
    {
      "No": 1,
      "Soru": "Mehmet Akif İstiklal Marşını nerede yazmıtır ?",
      "Dogru_Cevap": "Ankara - Taceddin Dergahı",
      "Yanlis_Cevap1": "Ankara - Keçiören Camisi",
      "Yanlis_Cevap2": "Ankara - Ayaş Dergahı",
      "Yanlis_Cevap3": "Ankara - Ayasofya"
    }, 
   {      "No": 2,
      "Soru": "Mehmet Akif İstiklal Marşını nerede yazmıtır ?",
      "Dogru_Cevap": "Ankara - Taceddin Dergahı",
      "Yanlis_Cevap1": "Ankara - Keçiören Camisi",
      "Yanlis_Cevap2": "Ankara - Ayaş Dergahı",
      "Yanlis_Cevap3": "Ankara - Ayasofya"
    }, 
   {      "No": 3,
      "Soru": "Mehmet Akif İstiklal Marşını nerede yazmıtır ?",
      "Dogru_Cevap": "Ankara - Taceddin Dergahı",
      "Yanlis_Cevap1": "Ankara - Keçiören Camisi",
      "Yanlis_Cevap2": "Ankara - Ayaş Dergahı",
      "Yanlis_Cevap3": "Ankara - Ayasofya"
    }
  ]
}


JSON Veri Çekme

JSON Veri Çekme İşlemi İçin Genel Veri Dosyası
İlk olarak hazır olan JSON dan çekilecek veriler için bir c# dosyası oluşturmamız gerekiyor, ben "jsonDataClass" adında bir c# dosyası oluşturdum.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class jsonDataClass
{
    
  public int Version;
  public string AppName;
    public sorularClass[] Sorular;
}
[System.Serializable]
public class sorularClass
{
    public int No;
    public string Soru;
    public string Dogru_Cevap;
    public string Yanlis_Cevap1;
    public string Yanlis_Cevap2;
    public string Yanlis_Cevap3;
}


Şimdi gelin buradaki kodları açıklayalım.

[System.Serializable]

Bu kod buradaki verilere her yerden erişebilmemizi sağlıyor, ardından oluşturduğumuz class ve içindeki veriler ise JSON dosyasından çekeceğimiz verilerdir ve JSON dosyasının içindeki ile aynı isimde olması gerekiyor. En yukarıdaki JSON dosyasını inceleyip buna dikkat edebilirsiniz.

Veri Çekme İşlemi

Verileri çekmek için yeni bir c# dosyası oluşturuyoruz. Ben adını "jsonController" olarak koydum.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class jsonController : MonoBehaviour
{
    public bool veriTabaniVarmi = false, Yenile=false;
    public string jsonURL;
    public string soru, dcevap, ycevap1, ycevap2, ycevap3;

    [System.Obsolete]
    void Start()
    {
        StartCoroutine(getData());
    }

    [System.Obsolete]
    private void Update()
    {
        if (Yenile)
        {
            StartCoroutine(getData());
            Yenile = false;
        }
    }

    [System.Obsolete]
    IEnumerator getData()
    {
        Debug.Log("Bekleyin");
        WWW _www = new WWW(jsonURL);
        yield return _www;
        if (_www.error == null)
        {
            processJsonData(_www.text);
            veriTabaniVarmi = true;
        }
        else
        {
            Debug.Log("Hata");
        }
    }

    public void processJsonData(string _url)
    {
        jsonDataClass jsnData = JsonUtility.FromJson(_url);

        int randomSoru = Random.Range(0, jsnData.Sorular.Length);
        soru = jsnData.Sorular[randomSoru].Soru;
        dcevap = jsnData.Sorular[randomSoru].Dogru_Cevap;
        ycevap1 = jsnData.Sorular[randomSoru].Yanlis_Cevap1;
        ycevap2 = jsnData.Sorular[randomSoru].Yanlis_Cevap2;
        ycevap3 = jsnData.Sorular[randomSoru].Yanlis_Cevap3;
    }

}

Şimdi gelin nerede ne yaptığımızı inceleyelim.

[System.Obsolete]
    void Start()
    {
        StartCoroutine(getData());
    }

Fonksiyonların başına eklediğimiz [System.Obsolete] ile yukarıda anlattığım "jsonDataClass" içerisindeki verilere erişebilmemizi sağlıyor.
StartCroutine ise Unity de internet üzerinden veri çekmemizi ve veri geldiği zaman scriptin çalışmasını sağlayan yapıdır.

 private void Update()
    {
        if (Yenile)
        {
            StartCoroutine(getData());
            Yenile = false;
        }
    }


Burada update() fonksiyonu içine start() fonksiyonu içinde yaptığımız fonksiyon çağırma işlemini tekrar yaptık, çünkü bazen internetten veri çekerken anında verilerimiz gelmez ve bir kaç kere daha denemek gerekebilir bu yüzden update ile veriler çekilene kadar deneme yapıyoruz.

 IEnumerator getData()
    {
        Debug.Log("Bekleyin");
        WWW _www = new WWW(jsonURL);
        yield return _www;
        if (_www.error == null)
        {
            processJsonData(_www.text);
            veriTabaniVarmi = true;
        }
        else
        {
            Debug.Log("Hata");
        }
    }


Evet arkadaşlar burada internet üzerinden JSON dosyamızı çektik ve eğer çekilmez ise hata vermesini sağladık. Buradaki kullanılan WWW komutunu biraz daha ayrıntılı olarak daha sonra başka bir konuda bahsedeceğim ama şimdilik internet üzerinden veri çekmemizi sağlayan genel yapı olduğunu söyleyebilirim.

Bu yazıda JSON dosyasını internet URL si üzerinden yapmayı gösterdim ve jsonURL yazan yere JSON un çekildiği internet URL sini yazarak yapabilirsiniz JSON verisini internetten çekmek istemezseniz ve hazır olan veriyi klasörden çekmek isterseniz yukarıdaki "jsonURL" yazan yeri
Application.dataPath + "JsonDosyasi".json" şeklinde Json dosyasının olduğu yeri belirterek yapabilirsiniz.

Bu arada arkadaşlar "Application.dataPath" kayıt dosyanızın oyun dosyaları arasına kaydolmasını sağlar. (Editör üzerinde Assets klasörü içerisine, build aldığınız zaman oyunun yüklü olduğu klasör içerisine.)
"Application.persistentDataPath" kullanırsanız oluşturulan json dosyası
C: => Users => [user] => AppData => LocalLow => [company name]
konumuna kaydolur.

Not : Oyun dosyası ya da locallow içinde herhangi oluşturduğunuz klasöre kaydetmek için yukarıda "JsonDosyasi" yazan kısmı "Dosya Adı/JsonDosyasi" şeklinde değiştirip Dosya Adı yazan kısma oluşturduğunuz dosyanın adını yazmanız yeterli olacaktır.

 public void processJsonData(string _url)
    {
        jsonDataClass jsnData = JsonUtility.FromJson(_url);

        int randomSoru = Random.Range(0, jsnData.Sorular.Length);
        soru = jsnData.Sorular[randomSoru].Soru;
        dcevap = jsnData.Sorular[randomSoru].Dogru_Cevap;
        ycevap1 = jsnData.Sorular[randomSoru].Yanlis_Cevap1;
        ycevap2 = jsnData.Sorular[randomSoru].Yanlis_Cevap2;
        ycevap3 = jsnData.Sorular[randomSoru].Yanlis_Cevap3;
    }


Burada Unityde hazır bulunan FromJson fonksiyonunu kullandık ve çekilen json verilerini c# verilerine dönüştürdük.
Ardından bu verileri istediğimiz değişkenlere atadık.
Ben JSON verimde soruları liste halinde barındırdığım ve her sahnede 1 soruyu rastgele çekmek istediğim için randomSoru kısmı ile Rastgele soru çekebiliyoruz.
Eğer JSON üzerinde bulunan Version ve AppName i çekmek isteseydik yapmamız gereken tek şey;
"jsnData.AppName" veya "jsnData.Version" yazmanız yeterli olacaktır.

int version;
version = jsnData.Version;

Tarzında istediğiniz veriyi çekebilirsiniz.
Aşağıya yorum olarak merak ettiğiniz veya aklınıza takılan bir yer olursa sorabilirsiniz.