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.
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 :
<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); } } }
{!{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..
import org.apache.http.HttpEntity;
gibi kütüphaneleri görmüyor sebebi ne olabilir?
android {
useLibrary ‘org.apache.http.legacy’
}
Gradle.app kısmına bunu eklemeniz gerekmektedir. 22’den sonraki sürümlerde görmemeye başladı.
Teşekkürler Ümit, çok faydalı oldu, kendi web servisimizi yazıp kendi servisimizi çağırmayı anlatmayı düşünüyor musun ?
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 🙂
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.
Merhaba Atakan, Öncelikle buradaki işlemleri yap mantığı kavra. Nasıl çekeceksin ne yapacaksın gibi. Anlamadığın yeri bence sorarsan daha yararlı oluruz.
Hemen yanıtladğınız için teşekkür ederim.
O halde ben de hemen işe başlıyorum 🙂
Siz başlayın takıldığınız yerde facebook ya da gmail üzerinden konuşuruz 🙂
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.
Ümit bey yardım edin mailime cevap verin lütfennn!!!
merhaba ümit ;
android {
useLibrary ‘org.apache.http.legacy’
}
nereye kopyalamam lazım suan onu yapamadım yardımcı olursanız sevinirim
Merhaba Hüseyin bey, Gradle App’de dependies’in içine olması gerek
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.
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 🙂
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 ?
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 🙂
malesef sync edilmiyor onu ekledeğimde tırnaklarıda düzgün koydum
Hüseyin bey verileri cekerken api key gerekmiyormu gerekiyorsa tam olarak nerede kullanacağız? Teşekkürler
Ü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 🙁
umiitkose@gmail.com‘a mesaj bırakırsanız ilgilenebilirim sorunuzun tam açık haliyle..
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 ?
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” } ]
Ö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ş….
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.
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
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
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?
Merhaba Büşra Hanım,
hatalar nedir ?
android{useLibrary ‘org.apache.http.legacy’} şu şekilde ekledim dependencies kısmına ama bir değişiklik olmadı.
Sorunu hallettim. Çok teşekkürler 🙂
DefaultHttpClient
HttpPost
HttpResponse
HttpEntity
Bunları görmüyor.
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
İ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
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”}}