JSON; (“Javascript Object Notation”), insanlar tarafından okunabilen bir veri değişimi biçimidir. XML’in Javascript ile çok da iyi kullanılamamasından dolayı tercih edilir. Klasik DOM ağaçlarından farksız bir yapıya sahiptir ve şu veri tiplerini destekler:

  • Number
  • String
  • Boolean
  • Array
  • Object
  • Null

Biz de bugün javada JSON kullanarak ilçeleri yazdığımızda o ilçeye ait hava durumunu gösteren ufak bir program yazacağız.

Öncelikle JSON’u çekeceğimiz API’yi analiz edelim:
http://api.openweathermap.org/data/2.5/find?q=Seyhan&units=metric

api.openweathermap.org/data/2.5/find > Bu bölüm sorguyu yapacağımız asıl link.

?q=Seyhan&units=metric > Burası da sorguya eklediğimz parametreler.

Sorgunun başındaki q harfi ilçeye göre sorgu yapacağımızı, units’in karşısındaki metric bölümü de metrik sistem kullandığımızı belirtmekte.

API linkine tıkladığımızda ise bizi aşağıdaki kodlar karşılıyor:

{
"message": "accurate",
"cod": "200",
"count": 1,
"list": [
{
"id": 300997,
"name": "Seyhan",
"coord": {
"lon": 35.2957,
"lat": 37.0045
},
"main": {
"temp": 25.51,
"pressure": 1010,
"humidity": 78,
"temp_min": 25,
"temp_max": 26
},
"dt": 1441394400,
"wind": {
"speed": 0.5,
"deg": 0
},
"sys": {
"country": "Turkey"
},
"clouds": {
"all": 20
},
"weather": [
{
"id": 801,
"main": "Clouds",
"description": "few clouds",
"icon": "02n"
}
]
}
]
}

Yukarıdaki koda baktığımızda { } içerisinde olan ifadeler görürüz. Bunlar JSON içerisinde obje olarak nitelendirilir. Tabii bu obje içerisinde başka objeler ya da JSON arrayler de tutulabilir. Biz ise burada yalnızca hava sıcaklığını kullanacağız.

Projemize başlamadan önce aşağıdaki classı projemize import etmeliyiz. Bu class API’den dönen JSON yapısını internetten çekmemizi sağlıyor. Ben de zaten yazılmış olduğu için tekrar yazmaya ihtiyaç duymadım.

 

package tr.com.cagrialdemir.havadurumu;

import android.util.Log;

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.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

public JSONParser() {
}

public static String getJSONFromUrl(String url) {
Log.e("URL", url);
try {
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());
}
return json;
}
}

Tabii internet erişimi için aşağıdaki satırı manifest dosyanıza eklemeyi de unutmayın.

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

Şimdi de layout tasarımını yapalım.

Benim tasarımımın xml’i şu şekilde:

<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/txtIlce"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:hint="LÜTFEN BİR İLÇE GİRİNİZ"
android:gravity="center"
android:layout_marginLeft="50dp"
android:maxLines="1"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GÖSTER"
android:id="@+id/btnGoster"
android:layout_below="@+id/txtIlce"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:textStyle="bold"
android:textColor="#4e7cff" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="00 \u2103"
android:id="@+id/txtSicaklik"
android:layout_below="@+id/btnGoster"
android:layout_centerHorizontal="true"
android:layout_marginTop="35dp"
android:textSize="75dp"
android:textColor="#4e7cff" />

Görünümü ise şöyle:

hava-durumu-screenshot

 

Son olarak da MainActivity classımızın içerisine aşağıdaki kodları yazıyoruz. Kodlarla ilgili gerekli tüm açıklamaları kod içerisinde yorum satırlarıyla yaptım.

package tr.com.cagrialdemir.havadurumu;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Butonumuzu cast ettik ve click özelliğini aktif ettik.
Button btnGoster = (Button) findViewById(R.id.btnGoster);
btnGoster.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Butonumuza click olduğunda GetHavaDurumu classımızı kullanarak dönen veriyi aldık.
new GetHavaDurumu().execute();
}
});
}

//GetHavaDurumu adında bir class oluşturduk ve AsyncTask classından extend ettik.
private class GetHavaDurumu extends AsyncTask {

//Widgetlerimizi cast ettik.
EditText txtIlce = (EditText) findViewById(R.id.txtIlce);
TextView txtSicaklik = (TextView) findViewById(R.id.txtSicaklik);

//String bir değişken oluşturduk ve sabit olan bölümleri elle verdik,
//değişmesi gereken bölümü ise txtIlce içinden aldık.
String havaDurumuApi = "http://api.openweathermap.org/data/2.5/find?q="
+ txtIlce.getText()
+ "&units=metric";

//Integer bir değişken oluşturduk.
int sicaklik;

@Override
protected Object doInBackground(Object[] params) {
try {
//Bir JSONObject oluşturduk.
JSONObject jsonObject = null;

//String bir değişken oluşturduk ve JSONParser classı ile API'den dönen değeri değişkenimize atadık.
String json = JSONParser.getJSONFromUrl(havaDurumuApi);
try {
//Stringimizi de JSONObject'e atadık.
jsonObject = new JSONObject(json);
} catch (JSONException e) {
e.printStackTrace();
}

//JSONArray oluşturup gelen değerde yer alan list adındaki arrayi JSONArray'e atadık.
JSONArray jsonArray = jsonObject.getJSONArray("list");

//Yeni bir JSONObject oluşturup array içinde 0. indexi atadık.
JSONObject jsonObject1 = jsonArray.getJSONObject(0);

//Yeni bir JSONObject daha oluşturup main objesini atadık.
JSONObject jsonObject2 = jsonObject1.getJSONObject("main");

//Son olarak main objesi içindeki temp değerini sicaklik değişkenimize atadık.
sicaklik = jsonObject2.getInt("temp");
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);

//Dönen değer sıfır ise "Aradığınız ilçe bulunamadı" mesajı verdik ve edit textimizin içini temizledik
if (sicaklik == 0) {
Toast.makeText(getApplicationContext(), "Aradığınız ilçe bulunamadı", Toast.LENGTH_LONG).show();
txtSicaklik.setText("");
} else {
//Sıfırdan farklı bir değerse txtSicaklik widgetimize dönen sıcaklık değerini atadık.
//Not: \u2103 değerinin karşılığı derece işaretidir.
txtSicaklik.setText(sicaklik + "\u2103");
}
}
}
}

Not: API’den dönen değer her zaman kesin sonuç vermeyebilir. Burada önemli olan JSON ile veriyi nasıl çekebileceğimizi öğrenmektir.

Projenin kaynak kodlarına buradan, APK’sına ise buradan ulaşabilirsiniz.

Bir sonraki yazıda görüşmek dileğiyle, kendinize iyi davranın…

CEVAP VER

Please enter your comment!
Please enter your name here