C# ile JSON Formatında Veri Ayrıştırma İşlemi

Batuhan Düzgün tarafından yayınlanmıştır 10. February 2012 08:15

Merhaba arkadaşlar , bu yazımda sizlere JSON sonuç kümesini ayrıştırmayı göstereceğim.JSON nedir? Sorusu ile başlayıp daha sonra JSON ayrıştırıcı kullanıp , ardından bunları C# programlama dili ile kullanacağız. Tabi , bunları hazırlamak yorucu bir günden sonra biraz zor olacak ama makale yazmak gerçekten ben için sanırım kafa dağıtıcı ve zevkli bir iş gibi. Lafı uzatmadan JSON ile başlayalım en iyisi.

 

JSON Nedir?

JSON Java Script Object Notation olarak geçer. Javascriptin bir alt kümesidir. XML gibi içerik kategorileme dilidir. JSON formatında çeşitli taglar anahtar sözcükler bulunur. Anahtar sözcükler   “  ”   arasına alınır. Ardından “:” işareti gelir. Bu şu anlama gelir ki bu anahtar sözcük bir kategoridir ve kategori kapsamı “ { } ” arasına alınarak belirlenir. Bu süslü parantezler arasında başka kategori isimleri de veya dizilerde olabilir. JSON daha çok AJAX kullanıcıları tarafından kullanılır. Javascript alt kümesi olduğu için AJAX için çok kullanışlıdır. Biz ise işlemesi daha kolay ve hızlı olduğu için JSON formatında verileri bir önceki makale de Google Reverse Geo Coding mekanizmasına http protokolü üzerinden GET-POST yöntemiyle webrequest yapılmıştı. İşte bu JSON sonuç kümesini işleme zamanı geldi artık deyip bu makale de JSON ayrıştırma anlatmak uygun düştü.

 

{
  "status":"OK",
  "results":[{
    "types":["street_address"],
    "formatted_address":"1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components":[{
      "long_name":"1600",
      "short_name":"1600",
      "types":["street_number"]
    },{
      "long_name":"Amphitheatre Pkwy",
      "short_name":"Amphitheatre Pkwy",
      "types":["route"]
    },{
      "long_name":"Mountain View",
      "short_name":"Mountain View",
      "types":["locality","political"]
    },{
      "long_name":"California",
      "short_name":"CA",
      "types":["administrative_area_level_1","political"]
    },{
      "long_name":"United States",
      "short_name":"US",
      "types":["country","political"]
    },{
      "long_name":"94043",
      "short_name":"94043",
      "types":["postal_code"]
    }],
    "geometry":{
      "location":{
        "lat":37.4219720,
        "lng":-122.0841430
      },
      "location_type":"ROOFTOP",
      "viewport":{
        "southwest":{
          "lat":37.4188244,
          "lng":-122.0872906
        },
        "northeast":{
          "lat":37.4251196,
          "lng":-122.0809954
        }
      }
    }
  }]
}

 

Yukarıda JSON sonuç kümesine örnek verilmiştir. Bu sonuç kümesinde  "location_type":"ROOFTOP"  bir kategoridir. Çünkü,  çift tırnak arasına alınmıştır ve bir isim verilmiştir. Daha önemlisi ise iki nokta üst üste konulup bunun bir kategori parçası olduğu belirtilmiştir. Bir başka önemli nokta ise bazı kod bölgelerinde “ [ ] “ işareti bulunmaktadır. Bu şu anlama gelir ki , bu parantezler arasında kalanlar bir diziyi ifade etmektedir.

Bir önceki makale  http://batuhanduzgun.blogcu.com/c-ve-google-reverse-geocoding-kullanimi/10887272

 

JSON Ayrıştırıcı API

JSON ayrıştırma için bir çok API mevcuttur. Benim kullanmakta sıkıntı çekmediğim ve kolay olan bir API ‘yi bu projede kullanmayı uygun gördüm. Aşağıdaki linkten bu API’yi indirebilirsiniz.

http://james.newtonking.com/pages/json-net.aspx

Ardından , projenizin References bölümüne sağ tıklayıp , indirdiğimiz DLL .NetFramework 3.5 için olan DLL ‘ni  “bin” klasörü içinden alıp referans olarak ekliyoruz. Böylece DLL ‘e ait sınıf yapılarını kullanma fırsatımız oluyor. Ardından , kod sayfasındaki en üst kısımda bu DLL ‘i çağırıyoruz.

usingNewtonsoft.Json.Linq;

 

Bu aşamadan sonra artık ilgili bileşenleri ve sınıfları, veri tiplerini kullanmaya başlanabilir. Bir önceki makaledeki kod kısımlarına ek olarak aşağıdaki kodları ekliyoruz. İlk önce kafalar karışmasın diye bir JSON formatı vereyim ve bunu ayrıştıran kodları ekleyeyim.

{

  "name": "45.560001373291,34.6699981689453",

  "Status": {

    "code": 200,

    "request": "geocode"

  },

  "Placemark": [ {

    "id": "p1",

    "address": "M17, Crimea, Ukraine",

    "AddressDetails": {

   "Accuracy" : 6,

   "Country" : {

      "CountryName" : "Ukraine",

      "CountryNameCode" : "UA",

      "Thoroughfare" : {

         "ThoroughfareName" : "M17"

      }

   }

},

    "ExtendedData": {

      "LatLonBox": {

        "north": 45.5660970,

        "south": 45.5607300,

        "east": 34.6738810,

        "west": 34.6678500

      }

    },

    "Point": {

      "coordinates": [ 34.6708724, 45.5634175, 0 ]

    }

  } ] }

stringResult = HttpProcolObject.GetJSON_ResultText();

 

 JObject JSONParser = JObject.Parse(Result);

 

 int Status = (int)JSONParser["Status"]["code"];

 

 JArray RootJSON = (JArray)JSONParser["Placemark"];

 

 string AddressofCoordinates = string.Empty;

 

 if (RootJSON != null)

 {

 AddressofCoordinates = (string)RootJSON[0]["address"].ToString();

 }

Yukarıdaki kodları açıklamak gerekirse , JObject nesnesi ile ayrıştırma işlemi gerçekleştirilecek olan JSON formatındaki metinsel ifadeyi Parse adlı metod ile ayrıştırıp , JObject tipinden  bir değişkene atanıyor. Ardından ayrıştırılmış ifade üzerinde bize yarayan ilgili kategorilere ait bilgileri okumak gerekiyor. İşte bu noktada Linq sayesinde spesifik olan kategori isimleri köşeli parantezler içine yazıp o kategoriye erişmiş oluyoruz. Ardından , eğer bu kategori kapsamı  içinde başka bir kategori  var ise , yine köşeli parantez ile o kategori ismini yazıp erişiyoruz. Önemli bir nokta ise ilk defa kullandığımda sıkıntı çekmiştim. JArray yapısı eğer ki JSON metinsel ifadesi içinde [ ] (köşeli parantezler arasında) bir ifade varsa bu bir dizi anlamına gelmektedir.  O sebeple diziye işaret eden anahtar kelimeyi yazıp , ardından JArray yapısı içine alıyoruz. Böylece yapıyı diziye aktarmış oluyoruz.

 

 

 

JSON ile ayrıştırma işlemi hem kolay hem de gayet performanslıdır. Bir sonraki makalemde görüşmek dileğiyle …

 

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi 

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

C#

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  November 2018  >>
MoTuWeThFrSaSu
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Yazıları geniş takvimde göster