Genel

Android Studio JSON kullanımı

Herkese Merhaba, Android Studio ile ilgili artık derinlemesine konulara girmeye başladık. JSON nedir? Bu soruyu soruyorsanız önceden yazdığım yazıyı okumanızda fayda var.

  • Okunabilen veri biçimi
  • {} içindeki herşey JSON’ın objesidir. [] içindeki herşey Jsonda diziye denk gelmektedir.
  • Desteklediği veri tipleri olarak –> Number,String,bool,Array,Object ve null

Öncelikle JSON için 2 şeyi yapıcaz. Android manifest’te İnternet izni alıcaz ve bir tane de JSONParser adlı dönüştürücü kullanıcaz. JSONParser internetten verileri çekmek için hazır oluşturulmuş kod parçacığı oluyor. Parametre olarak verdiğimiz linke sorgu atıyor ve cevap olarak bu linki döndürüyor. String formatında json’ımız dönüyor ve biz ayrıştırıyoruz.

Basit bir hava durumu uygulaması yapıcam. Genişletilmiş olarak’ta bunun uygulamasını yayınlıcam. (Döviz’de olabilir bu uygulama farklı olsun diye..)

Öncelikle Android Manifest için İnternet izni alıyoruz.

    <uses-permission android:name="android.permission.INTERNET"/>

Sonrasında JSONParser dosyamızı class’ımıza ekliyoruz.
package com.umiitkose.androiddoviz;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;
public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    // constructor
    public JSONParser() {
    }
    public static String getJSONFromUrl(String url) {
        Log.e("URL", url);
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } catch (UnsupportedEncodingException e) {
            Log.e("JSON Parser", "UnsupportedEncodingException " + e.toString());
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            Log.e("JSON Parser", "ClientProtocolException " + e.toString());
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("JSON Parser", "IOException " + e.toString());
            e.printStackTrace();
        }
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // JSON'ı string olarak döndürüyoruz.
        return json;
    }
}

Bundan sonra olacaklar :

//api.openweathermap.org/data/2.5/find?q=Ankara&units=metric Bu siteden verileri çekiceğiz. Öncelikle siteye girin. Karmaşık bir şekilde yazılmış. Bunu daha okunur hale getirmek için jsoneditor kullanabilirsiniz. //www.jsoneditoronline.org Örneğin bu site. Ne kadar anlaşılır ve kolay okunur olduğunu gösteriyoruz.

2015-09-05_16h31_31

Basit bir uygulama yapacağım. Bu json’da Şehir ismini, Ülkesini, Sıcaklığını ve Koordinatlarına erişeceğim.

Activity_main.xml dosyamız :

2015-09-05_16h33_03

<RelativeLayout xmlns:android="//schemas.android.com/apk/res/android"
    xmlns:tools="//schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:background="#93E0E5">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/linearLayout">

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/sehirIsmi"
            android:layout_weight="1" />
    </LinearLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Öğren"
        android:id="@+id/havaDurumuButton"
        android:nestedScrollingEnabled="true"
        android:width="250dp"
        android:height="70dp"
        android:layout_below="@+id/linearLayout"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/sehir"
        android:layout_below="@+id/havaDurumuButton"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="74dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/ulke"
        android:layout_below="@+id/sehir"
        android:layout_alignLeft="@+id/sehir"
        android:layout_alignStart="@+id/sehir"
        android:layout_marginTop="45dp"
        android:layout_alignRight="@+id/sehir"
        android:layout_alignEnd="@+id/sehir" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/sicaklik"
        android:layout_marginTop="25dp"
        android:layout_below="@+id/ulke"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:id="@+id/koordinat"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="45dp" />

</RelativeLayout>

Sıra geldi son işleme java dosyasında yapılacaklara:

Öncelikle activity_main’de oluşturduğumuz elemanları çekicez. 4 tane TextView, 1 tane EditText ve 1 tane de Button.

Button’u aktif edince bir metod çalışsın. AsynTask’tanda kalıtım alalım.

  • AsynTask ne işe yarıyor peki ? :

AsyncTask javada bulunan thread yapısının android için özelleştirilmiş bir class yapısıdır.Android sdksı ile developerlara sunulunan asynctask android de multi-thread programcılığına katkı sağlamaktadır.

  • Peki AsyncTask Ne Zaman Kullanılır?

AsyncTask arka planda işler yapmak gerektiği zaman kullanılabileceği gibi uzun sürebilecek işlemlerde Main thread veya UI threadıni engellememek için kullanabiliriz.Kısaca anlatmak gerekirse arkada planda bir işlem yaparken kullanıcıya’da ön planda bu işlem hakkında bilgi vermek için kullanılabilir. Örnek vermek gerekirse UI değişikliği yapılacağı zaman,web servis ile sunucuya bağlanılacağı zamanlarda kullanılabilir.

 

3 Metodunu kullanıyoruz. Onların açıklaması..

  • onPreExecute: Arka plan işlemi başlamadan önce ön yüzde değiştirilmesi istenen değişkenlerin (ProgressBar gibi animasyonlar) ve AsyncTask içinde gerekli değişkenlerin değer ataması yapılır.
  • doInBackground: Arka planda yapılması istenen işlem burada gerçekleşir. Bu metod içinde yapılan işlemler ön yüzde kullanıcının uygulamayı kullanmasını kesinlikle etkilemez. Eğer buradaki işlemler sonucunda ana akışa bir değişken gönderilmesi gerekiyorsa return metodu ile bu değişkenonPostExecute metoduna paslanabilir.
  • onPostExecute: doInBackground metodu tamamlandıktan sonra işlemlerin sonucu bu metodaresult değişkeni ile gönderilir. Buradaki işlemler ana akışı etkiler ve herhangi bir hataya sebep olmaz. Arka plandaki işlemden gelen bir veri ön yüzde gösterilmek isteniyorsa bu metod içinde gösterim işlemi yapılabilir.

Kodların yanına açıklamalarını yaptım.

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import android.widget.EditText;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    TextView sehir,ulke,sicaklik,koordinat;

    EditText sehirIsmi;
    Button havaDurumuButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sehir=(TextView)findViewById(R.id.sehir);
        ulke=(TextView)findViewById(R.id.ulke);
        sicaklik=(TextView)findViewById(R.id.sicaklik);
        koordinat=(TextView)findViewById(R.id.koordinat);
        havaDurumuButton=(Button)findViewById(R.id.havaDurumuButton);
        sehirIsmi= (EditText) findViewById(R.id.sehirIsmi);

        havaDurumuButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new HavaDurumu().execute();
            }
        });
    }
    private class HavaDurumu extends AsyncTask<Void,Void,Void>{
        int tempNo;
        String descriptionN;
        String countryName;
        String name;
        Double enlem,boylam;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
        @Override
         protected Void doInBackground(Void... voids) {
           String weatherUrl="//api.openweathermap.org/data/2.5/find?q="+ sehirIsmi.getText() +"&units=metric";
           JSONObject jsonObject=null;
            try {
                String json=JSONParser.getJSONFromUrl(weatherUrl);
                try {
                    jsonObject=new JSONObject(json);
                }catch (JSONException e){
                    Log.e("JSONPARSER", "Error creating Json Object" +e.toString());}
                  
                //En baştaki json objesinden list adlı array'ı çek
                JSONArray listArray=jsonObject.getJSONArray("list");
                //list'in ilk objesini çek 
                JSONObject firstObj=listArray.getJSONObject(0);
                //Bu alanda Name'i çek
               name = firstObj.getString("name");
                //ilk objenin içindeki objelerden main'i çek
                JSONObject main=firstObj.getJSONObject("main");

                //Sıcaklık
                tempNo=main.getInt("temp");
                //Ulke
                JSONObject country=firstObj.getJSONObject("sys");
                countryName=country.getString("country");

                //koordinat

                JSONObject koord=firstObj.getJSONObject("coord");
                enlem=koord.getDouble("lat");
                boylam=koord.getDouble("lon");
            }catch (JSONException e){
            Log.e("json","doINbackgrond");

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void args) {

                sehir.setText("Sehir: "+name);
            ulke.setText("Ülke: "+countryName);
            sicaklik.setText("Sıcaklık: "+tempNo + "\u2103");
            koordinat.setText("Koordinatlar:\n Enlem: "+enlem+"\n Boylam: "+ boylam);
        }

    }
}

2015-09-05_15h52_29NOT :
{!{code}!}czoxNzg6XCI8c3BhbiBjbGFzcz1cInBsblwiPmFuZHJvaWQgPC9zcGFuPjxzcGFuIGNsYXNzPVwicHVuXCI+ezwvc3Bhbj48c3BhbiBjbGFze1smKiZdfXM9XCJwbG5cIj4NCiAgICB1c2VMaWJyYXJ5IDwvc3Bhbj48c3BhbiBjbGFzcz1cInN0clwiPlwnb3JnLmFwYWNoZS5odHRwLmxlZ2FjeVwnPC97WyYqJl19c3Bhbj4NCjxzcGFuIGNsYXNzPVwicHVuXCI+fTwvc3Bhbj5cIjt7WyYqJl19{!{/code}!}

Bu kısmı eğer apache linkini görmüyorsa ekleyin.. Sebebi 22’den sonraki sürümlerde destek vermemesidir. Ekleyip snch ediniz..

34 thoughts on “Android Studio JSON kullanımı

  • yusuf

    import org.apache.http.HttpEntity;
    gibi kütüphaneleri görmüyor sebebi ne olabilir?

    Yanıtla
    • android {
      useLibrary ‘org.apache.http.legacy’
      }
      Gradle.app kısmına bunu eklemeniz gerekmektedir. 22’den sonraki sürümlerde görmemeye başladı.

      Yanıtla
  • Mehmet

    Teşekkürler Ümit, çok faydalı oldu, kendi web servisimizi yazıp kendi servisimizi çağırmayı anlatmayı düşünüyor musun ?

    Yanıtla
    • Ben Teşekkür Ederim Mehmet, En kısa zamanda yazmaya çalışırım. Ama şuan Mysql – php bağlantısı ve maps üzerine çalışıyorum. Siz benden önce yazın yayınlayalım 🙂

      Yanıtla
  • atakan

    Merhabalar,

    Beni yeniyim. Olayı tam olarak kavrayamıyorum.
    Yahoo’dan döviz kurlarını çekecek bir Android
    uygulaması yazmam gerekiyor.
    Nereden başlamalı ve neler yapmalıyım?
    Yardımcı olabilir misiniz acaba?

    Şimdiden teşekkür ederim.
    Kolay gelsin.

    Yanıtla
    • Merhaba Atakan, Öncelikle buradaki işlemleri yap mantığı kavra. Nasıl çekeceksin ne yapacaksın gibi. Anlamadığın yeri bence sorarsan daha yararlı oluruz.

      Yanıtla
  • atakan

    Hemen yanıtladğınız için teşekkür ederim.
    O halde ben de hemen işe başlıyorum 🙂

    Yanıtla
    • Siz başlayın takıldığınız yerde facebook ya da gmail üzerinden konuşuruz 🙂

      Yanıtla
      • atakan

        Merhabalar,

        Önceki mesajımın üstünden yaklaşık iki ay geçmiş.
        Hayret, zaman ne kadar hızlı geçiyor!..

        Bu geçen süre zarfında 2 java, 1 Android kitabı
        bitirdim. Epey ilerleme kaydettim diyebilirim.
        Ancak hala bilmediğim çok şey olduğunu biliyorum 🙂

        Bir konuda yardımınızı rica edeceğim.
        Örneğin Yahoo’dan döviz kurlarını çeken bir program
        yaptım. Bunun içinde ayrıca bir FAVORİLERİM veya
        SIK KULLANDIKLARIM gibi bir List yapmak istiyorum.
        Bunun NASIL Yapılacağı konusunda bilgi verebilir
        misiniz mümkünse?

        Kolaylıklar ve başarılar dilerim.

        Yanıtla
  • hüseyin

    merhaba ümit ;
    android {
    useLibrary
    ‘org.apache.http.legacy’
    }

    nereye kopyalamam lazım suan onu yapamadım yardımcı olursanız sevinirim

    Yanıtla
    • Merhaba Hüseyin bey, Gradle App’de dependies’in içine olması gerek

      Yanıtla
  • mehmeterenballı

    android studio kullanıyorum.cannot resolve defaulthttpclient diyor.httppost içinde aynısı geçerli.internettten aradım dependencies e şunu koy falan diyo.koydum.rebuild dedim yine çalışmıyor.yardımcı olursanız sevinirim.

    Yanıtla
    • useLibrary ‘org.apache.http.legacy’ (İki tırnak düzgün çıkmıyor onu elle düzeltirsiniz.) Gradle’de app kısmında dependencies kısmına yapıştırırsanız hata gidecektir. Sonra Built’ten clean project yaparsanız düzelir 🙂

      Yanıtla
  • ali veli

    iyi günler android stduio api 18 ile bu projede JSONParser i ekleyince hata veriyor üzeri kırmızı oluyor ve hata açıklamsı yok neden olabilir ?

    Yanıtla
    • useLibrary ‘org.apache.http.legacy’ (İki tırnak düzgün çıkmıyor onu elle düzeltirsiniz.) Gradle’de app kısmında dependencies kısmına yapıştırırsanız hata gidecektir. Sonra Built’ten clean project yaparsanız düzelir 🙂

      Yanıtla
      • ali veli

        malesef sync edilmiyor onu ekledeğimde tırnaklarıda düzgün koydum

        Yanıtla
  • Rıdvan Burak

    Hüseyin bey verileri cekerken api key gerekmiyormu gerekiyorsa tam olarak nerede kullanacağız? Teşekkürler

    Yanıtla
  • Kübra

    Ümit bey ben projeyi çalıştırdım,kodlamada hata yok,ama Textviewdeki değerleri null olarak döndürüyor,bana yardımcı olabilir misiniz Acaba hata nerde çok önemli bir proje için lazım hayati bir mesele 🙁

    Yanıtla
  • Kübra

    Hocam,bunu lokalde denemek için index.php adlı sayfama sizin kullandığınız json verilerini kaydettim.çalıştırdım,sorun yok.Ama,siz url’e String weatherUrl=”//api.openweathermap.org/data/2.5/find?q=”+ sehirIsmi.getText() +”&units=metric”; yazdınız.Bense String weatherUrl=”//localhost/phpcalisma/index.php”+sehirIsmi.getText() +”&units=metric” yazdım ve sayfam çalışmadı.Bağlantı stringimi ne olarak değiştirmem gerek sizce ?

    Yanıtla
  • Onur

    Merhaba Ümit,

    Bir uygulama üzerinde çalışıyorum. Uygulamam da web sitesine yüklemiş olduğum xml dosyasından tüm yemek menüsünü çekebiliyorum. Güncel tarihide alabiliyorum fakat bunun yanı sıra güncel tarihe göre listedeki uygun tarihi eşleştirip günlük(güncel tarihe uygun) yemek listesini nasıl çekebilirim. Bu konuda bana yardımcı olabilir misiniz? Gerek duyulursa kod paylaşımı yapabilirim.

    * web sitesine yüklemiş olduğum yemek listesi formatı şu şekildedir.

    [ { “Tarih” : “22.03.2017”,
    “Yemek” : “Pilic Buke
    Sahan Kofte
    Bulgur Pilavi
    Biberli Lahana Sote
    Zy.Brokoli
    Cilbir
    Elmali Tart
    Limonlu Kup”,
    “Kalori” : “1415” },

    { “Tarih” : “23.03.2017”,
    “Yemek” : “Dugun Corba
    Taze Fasulye
    Bezelye
    Kekikli Kuskus
    Sade Pirinc Pilav
    Zy.Bruksel Lahana
    Zy.Kereviz
    Peynir Tatlisi
    Tarcinli Sutlac”,
    “Kalori” : “1375” } ]

    Yanıtla
  • tunahan

    Öncelikle elinize sağlık.
    Bir haftadır bu konuyu araştırıyorum, bir konu bu kadar zevkli ve anlaşılır anlatılır. 10 numara olmuş….

    Yanıtla
    • Merhaba artık bu tarz kullanım eski oldu. Volley, Retrofit ile de bu işlemleri kolay bir şekilde yapabilirsiniz. En kısa zamanda yeniden yazmayı bende çok istemekteyim.. Çok güzel yorumunuz için teşekkür ederim.

      Yanıtla
  • SERAP

    Json.java sınıfınındaki import org satırları bazı kelimeleri silik bazılar kırmızı olarak hata veriyor ne yapmalıyım yardımcı olurmusunuz?acillll

    Yanıtla
  • SERAP

    Json.java sınıfınındaki import org satırları bazı kelimeleri silik bazılar kırmızı olarak hata veriyor ne yapmalıyım yardımcı olurmusunuz?acillll

    Yanıtla
  • Büşra

    try {
    // defaultHttpClient
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(url);
    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();
    is = tpEntity.getContent();
    } catch (UnsupportedEncodingException e) {
    Log.e(“JSON Parser”, “UnsupportedEncodingException ” + e.toString());
    e.printStackTrace();
    } catch (ClientProtocolException e) {
    Log.e(“JSON Parser”, “ClientProtocolException ” + e.toString());
    e.printStackTrace();
    } catch (IOException e) {
    Log.e(“JSON Parser”, “IOException ” + e.toString());
    e.printStackTrace();
    }

    Bu kısımda hatalar var çözümü için yardımcı olabilir misiniz?

    Yanıtla
      • Büşra

        android{useLibrary ‘org.apache.http.legacy’} şu şekilde ekledim dependencies kısmına ama bir değişiklik olmadı.

        Yanıtla
        • Büşra

          Sorunu hallettim. Çok teşekkürler 🙂

          Yanıtla
  • Büşra

    DefaultHttpClient
    HttpPost
    HttpResponse
    HttpEntity
    Bunları görmüyor.

    Yanıtla
    • Büşra

      Dediğiniz gibi useLibrary ‘org.apache.http.legacy’ tırnakları düzelterek ekledim. Şu şekilde hata alıyorum.

      Error:(30, 0) Gradle DSL method not found: ‘useLibrary()’
      Possible causes:The project ‘JSON(UmitKose)’ may be using a version of the Android Gradle plug-in that does not contain the method (e.g. ‘testCompile’ was added in 1.1.0).
      Upgrade plugin to version 2.3.3 and sync projectThe project ‘JSON(UmitKose)’ may be using a version of Gradle that does not contain the method.
      Open Gradle wrapper fileThe build file may be missing a Gradle plugin.
      Apply Gradle plugin

      Yanıtla
  • Ahmet

    İyi günler Ümit Bey benim sorum array içinde bir array olursa onu nasıl çekeceğim mesela bir örnek vermek gerekirse hava durumunda bulutlu yazmıssınız peki bulutun içinde de parçalı bulutlu gibi tekrar bir array yazsak ve bunu çekmek istesek nasıl çekebiliriz Şimdiden Teşekkür ederim

    Yanıtla
  • oguz

    Arkadaşlar yukarıdaki json örneği çok var internette yabancı sitelerde fakat aşağıda vereceğim json örneğinin androidde kullanımını çok bulamadım kodlamadan anlayan arkadaşlardan ricam bu json örneğinin url den androidde kullanımı ve listelenmesi ile ilgili paylaşımlar yapmaları

    {“android”:{“ad”:”EURUSD”,”kisa”:”EURUSD Analysis Chart 05.04.2018″,”resim”:”eurusd05042018.png”},”android1″:{“ad”:”DE30EUR”,”kisa”:”GER30 Analysis Chart 05.04.2018″,”resim”:”ger3005042018.png”},”android2″:{“ad”:”NZDUSD”,”kisa”:”NZDUSD Analysis Chart 05.04.2018″,”resim”:”nzdusd05042018.png”},”android3″:{“ad”:”USDJPY”,”kisa”:”USDJPY Analysis Chart 05.04.2018″,”resim”:”usdjpy05042018.png”},”android4″:{“ad”:”XAUUSD”,”kisa”:”GOLD Analysis Chart 05.04.2018″,”resim”:”gold05042018.png”}}

    Yanıtla

ali veli için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir