Android Studio – Gson ile Json Parse etme işlemleri

18 Ara

Merhaba arkadaşlar,
Bugün sizlere Android studio ile Json verilerini nasıl parse edip kullanırız anlatmaya çalışacağım.

Gson kütüphanesi, Json verilerilerini parse etmemize yarıyor. Android studioda, gördüğüm kadarıyla genel olarak bu kullanıyor gibi.

Bu kütüphaneyi .Net’teki yardımcı kütüphaneler gibi düşünebilirsiniz.
Mesela orada Newtonsoft.Json var burada bu var gibi.

Gson kullanımı

Bu kütüphane sadece String(Json datası) data’yı alıyor ve Modele set ediyor.
Yani bizlerin ilk önce bir Json Datasına ihtiyacımız olacak.
Bundan dolayı ben bu yazıda Android Studio’da Json datasını nasıl çağırırız(HttpRequest) işlemlerinide anlatmış olacağım.

Aşağıda ki uygulama ile test edelim.
Öncelikle AndroidManifest.xml dosyamıza internet erişimi için izin ekleyelim.

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

Manifest dosyası tam hali;

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.semih.gsontestapp">
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Şimdi Gson kütüphanesini projemize dahil edelim;
Bunun için build.grandle dosyasını açıyoruz
dependencies içine compile ‘com.google.code.gson:gson:2.8.2’ yazıyoruz.
Yukarıda Sync Now linki çıkacak ona tıklayıp ekliyoruz.
Güncel Gson kütüphanesini eklemek için buradan sürümüne bakabilirsiniz : https://github.com/google/gson

Ben bu örnekte, burada ki json verisini kullanacağım.

Bu veri sonucunda olması gereken modelim şu şekilde;
Burada model classını hızlıca otomatik olarak oluşturmak için bu online aracı önerebilirim, tek tek yazmakla uğraşmaktan kurtarıyor bizi : http://www.jsonschema2pojo.org/

PostModel.java

package com.example.semih.gsontestapp;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class PostsModel {

    @SerializedName("userId")
    @Expose
    private Integer userId;
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("body")
    @Expose
    private String body;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

}

Modelimizi hazırladık ve internet erişim iznini ayarladık.
Artık Api’ye istekte bulunup Gson ile parse edebiliriz.

MainActivity.java dosyam; önemli kodların açıklamalarını en altta yapıyorum.

package com.example.semih.gsontestapp;

import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

public class MainActivity extends AppCompatActivity
{
    String url = "https://jsonplaceholder.typicode.com/posts";
    String jsonData = "";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // + internet erişimi için;
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        //-

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try
        {
            // + Json verisi çekiliyor.
            jsonData = GetJsonData(url);
            // -

            // + Gelen veri liste şeklinde olacağı için
            // Modelimizin Liste tipinde olacağını belirtiyoruz.
            Type postModelListType = new TypeToken<List<PostsModel>>(){}.getType();
            // -

            // + Gson ile Json verisi okunur ve Listeye alınır.
            Gson gson = new Gson();
            List<PostsModel> postsModelList = gson.fromJson(jsonData, postModelListType);
            // -

            for(int i=0; i<postsModelList.size(); i++)
            {
                System.out.println(postsModelList.get(i).getTitle());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    //Json datasını indirip okur, String olarak geri döner.
    public String GetJsonData(String _url) throws IOException
    {
        StringBuilder sb = new StringBuilder();
        URL uri = new URL(_url);
        HttpURLConnection urlConnection = (HttpURLConnection) uri.openConnection();

        try {
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader bin = new BufferedReader(new InputStreamReader(in));
            String inputLine;

            while ((inputLine = bin.readLine())!= null)
            {
                sb.append(inputLine);
            }
        }
        finally
        {
            urlConnection.disconnect();
        }

        return sb.toString();
    }
}

try bloğu içerisinde;

public String GetJsonData(String _url) throws IOException methodu ile web sitesine istekte bulunup dönen json sonucunu String olarak dönüyoruz.

 // + Json verisi çekiliyor.
 jsonData = GetJsonData(url);
 // -

Daha sonra Gson ile parse ediyoruz.

List<PostsModel> postsModelList = gson.fromJson(jsonData, postModelListType);

.Net‘te postModelListType kısmında;

List<PostsModel>()

diyerek direkt atama yapabiliyoruz ancak Java‘da bunu tek satırda yapmamıza izin vermiyor.

Öncelikle liste için kullancağımız modeli bir Type belirtmemizi istiyor.
Bundan dolayı;

Type postModelListType = new TypeToken<List<PostsModel>>(){}.getType();

ile Type oluşturuyoruz.

Daha sonra jsonData içinde ki verileri gson.fromJson(jsonData, postModelListType); kodu ile ayrıştırıp Generic Listemize(List< PostsModel >) atıyoruz.

// + Gelen veri liste şeklinde olacağı için
// Modelimizin Liste tipinde olacağını belirtiyoruz.
Type postModelListType = new TypeToken<List<PostsModel>>(){}.getType();
// -

// + Gson ile Json verisi okunur ve Listeye alınır.
Gson gson = new Gson();
List<PostsModel> postsModelList = gson.fromJson(jsonData, postModelListType);
// -

Evet arkadaşlar işlemlerimiz bu kadar. Console ekranı ekran çıktısı;

Yararlı olabilecek kaynaklar;
Gson Tutorial — Getting Started with Java-JSON Serialization & Deserialization

Gson Tutorial — Mapping of Arrays and Lists of Objects

Using GSON in Android – Simple Demo

Bir Cevap Yazın