Exemplos práticos (Consumo/envio JSON com biblioteca remotamente)

Inicialmente cria-se um novo projeto no Android Studio. No arquivo build.gradle (Module:app) deve ser adicionado a linha implementation ‘com.google.code.gson:gson:2.11.0'. No arquivo AndroidManifest.xml deve ser adicionado a linha <uses-permission android:name="android.permission.INTERNET"/>.

Neste exemplo, será consumido o JSON retornado da seguinte URL: https://jsonplaceholder.typicode.com/posts/. Antes de implementar a classe MainActivity, primeiro será criado a classe POJO derivada do arquivo JSON. Neste material será usado a biblioteca criada por joelittlejohn, disponível em: http://www.jsonschema2pojo.org/. Esse site permite fazer a conversão de JSON para classe POJO para ser usada com a biblioteca GSON. A figura 1 mostra o site.

json pojo

Após a criação da class POJO, pode-se dar continuidade no projeto. Os códigos estão disponibilizados a seguir:

No arquivo AndroidManifest.xml adicione <uses-permission android:name="android.permission.INTERNET" />

  • Conversao.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    public class Conversao {
        public String converter(InputStream inputStream) {
            if (inputStream == null) return null;
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            StringBuilder stringBuilder = new StringBuilder();
            String conteudo;
            try {
                while ((conteudo = bufferedReader.readLine()) != null) {
                    stringBuilder.append(conteudo).append("\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }
    }
  • Conexao.java

    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    public class Conexao {
        public InputStream obterRespostaHTTP(String end) {
            try {
                URL url = new URL(end);
                HttpURLConnection conexao = (HttpURLConnection) url.openConnection();
                conexao.setRequestMethod("GET");
                conexao.connect();
                return new BufferedInputStream(conexao.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
  • Item.java

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    public class Item {
        @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; }
        @Override
        public String toString() {
            return "Item{" +
                    "userId=" + userId +
                    ", id=" + id +
                    ", title='" + title + '\'' +
                    ", body='" + body + '\'' +
                    '}';
        }
    }
  • activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp"
        tools:context=".MainActivity">
        <ListView
            android:id="@+id/listViewDados"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="1dp" />
    </LinearLayout>
  • MainActivity.java

    import android.os.Bundle;
    import androidx.activity.EdgeToEdge;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.graphics.Insets;
    import androidx.core.view.ViewCompat;
    import androidx.core.view.WindowInsetsCompat;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import java.io.InputStream;
    import java.lang.reflect.Type;
    import java.util.ArrayList;
    import java.util.List;
    public class MainActivity extends AppCompatActivity {
        private ListView listView;
        private ArrayAdapter<String> adapter;
        private List<String> listaStrings;
        private final String URL = "https://jsonplaceholder.typicode.com/posts";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = findViewById(R.id.listViewDados);
            listaStrings = new ArrayList<>();
            adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listaStrings);
            listView.setAdapter(adapter);
            new obterDados().execute();
        }
        private class obterDados extends AsyncTask<Void, Void, List<Item>> {
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Toast.makeText(getApplicationContext(), "Download começando...", Toast.LENGTH_SHORT).show();
            }
            @Override
            protected List<Item> doInBackground(Void... voids) {
                Conexao conexao = new Conexao();
                InputStream inputStream = conexao.obterRespostaHTTP(URL);
                Conversao Conversao = new Conversao();
                String textoJSON = Conversao.converter(inputStream);
                Log.i("JSON", "doInBackground: " + textoJSON);
                if (textoJSON != null) {
                    Gson gson = new Gson();
                    Type type = new TypeToken<List<Item>>() {}.getType();
                    return gson.fromJson(textoJSON, type);
                }
                return null;
            }
            @Override
            protected void onPostExecute(List<Item> dadosBaixados) {
                super.onPostExecute(dadosBaixados);
                if (dadosBaixados != null) {
                    listaStrings.clear();
                    for (Item item : dadosBaixados) {
                        listaStrings.add("UserID: " + item.getUserId()
                                + "\nID: " + item.getId()
                                + "\nTítulo: " + item.getTitle()
                                + "\nBody: " + item.getBody());
                    }
                    adapter.notifyDataSetChanged();
                } else {
                    Toast.makeText(getApplicationContext(), "Não foi possível obter JSON", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

A classe AsyncTask foi descontinuada, segue a versão abaixo usando a classe Executor:

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

  • Arquivo Gradle: implementation("com.google.code.gson:gson:2.11.0")

  • Item.java

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;
    public class Item {
        @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; }
        @Override
        public String toString() {
            return "Item{" +
                    "userId=" + userId +
                    ", id=" + id +
                    ", title='" + title + '\'' +
                    ", body='" + body + '\'' +
                    '}';
        }
    }
  • Conexao.java

    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    public class Conexao {
        public InputStream obterRespostaHTTP(String end) {
            try {
                URL url = new URL(end);
                HttpURLConnection conexao = (HttpURLConnection) url.openConnection();
                conexao.setRequestMethod("GET");
                conexao.connect();
                return new BufferedInputStream(conexao.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
  • Conversao.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    public class Conversao {
        public String converter(InputStream inputStream) {
            if (inputStream == null) return null;
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            StringBuilder stringBuilder = new StringBuilder();
            String conteudo;
            try {
                while ((conteudo = bufferedReader.readLine()) != null) {
                    stringBuilder.append(conteudo).append("\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }
    }
  • activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp"
        tools:context=".MainActivity">
        <ListView
            android:id="@+id/listViewDados"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="1dp" />
    </LinearLayout>
  • MainActivity.java

    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.util.Log;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import java.io.InputStream;
    import java.lang.reflect.Type;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    public class MainActivity extends AppCompatActivity {
        private ListView listView;
        private ArrayAdapter<String> adapter;
        private List<String> listaStrings;
        private final String URL = "https://jsonplaceholder.typicode.com/posts";
        private List<Item> dadosBaixados;
        private ExecutorService executorService;
        private Handler mainHandler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = findViewById(R.id.listViewDados);
            listaStrings = new ArrayList<>();
            adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listaStrings);
            listView.setAdapter(adapter);
            executorService = Executors.newSingleThreadExecutor();
            mainHandler = new Handler(Looper.getMainLooper());
            obterDados();
        }
        private void obterDados() {
            Toast.makeText(getApplicationContext(), "Download começando...", Toast.LENGTH_SHORT).show();
            executorService.execute(() -> {
                try {
                    Conexao conexao = new Conexao();
                    InputStream inputStream = conexao.obterRespostaHTTP(URL);
                    Conversao conversao = new Conversao();
                    String textoJSON = conversao.converter(inputStream);
                    Log.i("JSON", "doInBackground: " + textoJSON);
                    if (textoJSON != null) {
                        Gson gson = new Gson();
                        Type type = new TypeToken<List<Item>>() {}.getType();
                        dadosBaixados = gson.fromJson(textoJSON, type);
                    }
                    List<String> finalLista = new ArrayList<>();
                    if (dadosBaixados != null) {
                        for (Item item : dadosBaixados) {
                            finalLista.add("UserID: " + item.getUserId()
                                    + "\nID: " + item.getId()
                                    + "\nTítulo: " + item.getTitle()
                                    + "\nBody: " + item.getBody());
                        }
                    }
                    mainHandler.post(() -> {
                        if (dadosBaixados != null) {
                            listaStrings.clear();
                            listaStrings.addAll(finalLista);
                            adapter.notifyDataSetChanged();
                        } else {
                            Toast.makeText(getApplicationContext(), "Não foi possível obter JSON", Toast.LENGTH_SHORT).show();
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                    mainHandler.post(() ->
                            Toast.makeText(getApplicationContext(), "Erro ao baixar dados", Toast.LENGTH_SHORT).show()
                    );
                }
            });
        }
    }
  • Referências: As classes Conexao e Conversao foram adaptadas do site Stack Overflow (https://stackoverflow.com/questions/58889465/json-parsing-error-value-jsonstr-of-type-java-lang-string-cannot-be-converted-t) realizada pelo usuário Saad ( https://stackoverflow.com/users/7741722/saad) e respondida por Mike M. (https://stackoverflow.com/users/2850651/mike-m). Acesso em: 21 de ago. 2025.

  • Exemplos práticos (API JSON SERVER)

Neste exemplo, será usado uma biblioteca que permite criar uma API REST falsa destinada à testes. Para maiores detalhes sobre o biblioteca, acesse o endereço: https://github.com/typicode/json-server. Acesso em: 30 de jan. 2023.

Conforme mostra no endereço supracitado para instalar o json-server, basta abrir o terminal e digitar o comando: npm install -g json-server

Atenção: É necessário ter o node.js instalado no computador para biblitoca funcionar. Em seguida, crie um arquivo com extensão.json, por exemplo db.json, banco.json, dados.json, etc.

db.json

{
   "agenda" : [
    { "id" : 1 , "nome" : "Ana" , "telefone" : "1111-1111"  },
    { "id" : 2 , "nome" : "Helder" , "telefone" : "2222-2222"  },
    { "id" : 3 , "nome" : "Fagno" , "telefone" : "3333-3333"  }
  ],
  "adicionais" : [
    { "id" : 1 , "email" : "ana@ifto.edu.br"},
    { "id" : 2 , "email" : "helder@ifto.edu.br"},
    { "id" : 3 , "email" : "fagno@ifto.edu.br"}
  ]
  }

Após salvar o arquivo abre o terminal e vamos ligar o servidor usando o comando: json-server db.json

Se tudo deu certo, a seguinte mensagem será impressa no terminal:

\{^_^}/ hi!
Loading db.json
Done
Resources
http://localhost:3000/agenda    //o conteúdo do arquivo db.json, porém mostrando o conteúdo do array agenda
http://localhost:3000/adicionais   //o conteúdo do arquivo db.json,  porém mostrando o conteúdo do array adicionais

Infelizmente, não é possível consumir o arquivo disponibilizado pelo endereço: http://localhost:3000, pois o Android, por questões de segurança, atualmente aceita apenas comunicação via HTTPS. Mas a equipe que desenvolveu a biblioteca também disponibiliza um servidor com HTTPS chamado My JSON Server cujo o endereço para acesso é: https://my-json-server.typicode.com/. Na página Web supracitada tem-se os passos necessários para usar o servidor. São etapas simples, como pode ser vista a seguir:

  • Crie uma conta no GitHub;

  • Crie um repositório;

  • Crie um arquivo chamado db.json (coloque o conteúdo já disponibilizado neste exemplo).

  • Acesse o endereço https://my-json-server.typicode.com/<coloque seu nome de usuário><coloque o nome do repositório criado>

E pronto, o seu arquivo json já estará disponível no servidor on-line. A figura 3 mostra o resultado.

Figura 3

resultado json server

Observe na figura 3 que há 3 links clicáveis:

  • na opção agenda, serão mostrados os dados contidos dentro do array agenda;

  • na opção adicionais, serão mostrados os dados contidos dentro do array adicionais;

  • e na opção db, serão mostrados tanto o array agenda e o adicionais com os conteúdos.

Agora, basta criar um app cliente no Android para consumir os dados disponíveis em: https://my-json-server.typicode.com/<seu nome de usuário no GitHub><seu repositório>/db.